深入理解 call() 和 apply()

call()apply() 的作用

call()apply() 可以改变对象的执行上下文,也就是 this 的指向。

怎么理解执行上下文呢?

举个不一定恰当的栗子:我们去参加一个会议,到会人员都要用大会准备好的笔在花名册上签到,当我用这支笔签到的时候 执行上下文 就是我,接下来我朋友用这支笔签到,此时的 执行上下文 就是变成了我朋友。

call()apply() 的定义

apply():调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments); 即A对象应用B对象的方法。
call():调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2); 即A对象调用B对象的方法。

简而言之就是借另一个对象的方法用一下。

那么为什么要借呢?

我们来思考这样一个问题:为什么现在很多人会去骑共享单车而不是自己买一辆自行车呢?
其实原因很简单,既方便又省钱。所以这种借方法用一下的原因也是一样的,既可以完成需求,又节省了内存。
下面的例子,admin 定义了一个 writeName 方法,但是 user1user2 却没有,而他们还想用,怎么办呢?我们借一下。
注:user1user2 通过改变 this 的指向借用了 admin 的方法,所以此时 this 是指向 user1user2 的,因此打印出来的为他们各自的名字(就好像上一个例子,admin 作为管理员为参会人提供了笔,即 writeName 这个方法,参会人虽然都用了 admin 提供的笔,但是要各写各的名字)。

var admin = {
    name: '管理员',
    writeName: function (type) {
        console.log(type + ':' + this.name);
    }
};
var user1 = {
    name: '张三'
};
var user2 = {
    name: '李四'
};
admin.writeName('管理员'); // 管理员: 管理员
admin.writeName.call(user1, '参会人1'); // 参会人1: 张三
admin.writeName.apply(user1, ['参会人1']); // 参会人1: 张三  
admin.writeName.call(user2, '参会人2'); // 参会人2: 李四
admin.writeName.apply(user2, ['参会人2']); // 参会人2: 李四   
call()apply() 的相同点

调用一个对象的一个方法,用另一个对象替换当前对象。

call()apply() 的不同点

apply() 最多只能有两个参数:

  • 第一个参数为新的this对象(默认为全局对象);
  • 第二个参数为一个有参数组成的数组(有效的数组或 arguments 对象)。

call() 可以接受多个参数:

  • 第一个参数同 apply(默认为全局对象) ;
  • 后面则是一串参数列表。

你可能感兴趣的:(深入理解 call() 和 apply())