call、apply、bind用法和this指向问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

友情链接:

这是我在政万通平台上的知识岛屿账号,我会不定时在平台发布一些有深度的技术文章,欢迎大家一起来学习交流:https://www.zwtoon.com/islandSearch


前言

分享学习js逆向路上遇到的一些js语法

一、关于js语法中call、apply、bind的用法和涉及到的this指向的问题。

1.call、apply、bind的用法:

  1. 都是对函数的操作,使用方式:函数.call
  2. 都是用来改变函数的 this 对象的指向的。
  3. 第一个参数都是 this 要指向的对象。
  4. 都可以利用后续参数传参。
  5. call 接受函数传参方式为:fn.call(this, 1, 2, 3)
  6. apply 接受函数传参方式为:fn.apply(this,[1, 2, 3])
  7. bind 的返回值为一个新的函数,需要再次调用: fn.bind(this)(1, 2, 3)

2.实际案例:

代码如下(示例):

function Animal() {
    this.name = "cat";
    this.showName = function () {
        console.log(this.name);
    }
}

function Dog() {
    this.name = "dog";
}

var animal = new Animal();
var dog = new Dog();

animal.showName() //cat
animal.showName.call(dog); //dog

总结

上边的代码会输出两行,分别是 "animal""dog"

解释如下:

  1. 第一个输出 "animal"

    • 当调用 animal.showName() 时,this 关键字在 showName 方法内部指向 animal 实例。因为 animal 是通过 new Animal() 创建的,所以它的 name 属性被设置为 "animal"。因此,console.log(this.name); 输出 "animal"
  2. 第二个输出 "dog"

    • 当调用 animal.showName.call(dog); 时,Function.prototype.call 方法被用于调用 animal 实例的 showName 方法,但此时 this 关键字在 showName 方法内部被显式地设置为 dog 实例。这意味着在 showName 方法内部,this.name 实际上是在访问 dog 实例的 name 属性。因为 dog 是通过 new Dog() 创建的,并且其 name 属性被设置为 "dog",所以 console.log(this.name); 输出 "dog"

综上所述,第一个调用 animal.showName() 输出了 animal 实例的 name 属性值 "animal",而第二个调用 animal.showName.call(dog); 通过 call 方法将 this 绑定到 dog 实例,从而输出了 dog 实例的 name 属性值 "dog"

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值