深入理解 call() 和 apply()
2019-05-21 本文已影响0人
direwolf_
call()
和 apply()
的作用
call()
和 apply()
可以改变对象的执行上下文,也就是 this
的指向。
怎么理解执行上下文呢?
举个不一定恰当的栗子:我们去参加一个会议,到会人员都要用大会准备好的笔在花名册上签到,当我用这支笔签到的时候 执行上下文
就是我,接下来我朋友用这支笔签到,此时的 执行上下文
就是变成了我朋友。
call()
和 apply()
的定义
apply()
:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);
即A对象应用B对象的方法。
call()
:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);
即A对象调用B对象的方法。
简而言之就是借另一个对象的方法用一下。
那么为什么要借呢?
我们来思考这样一个问题:为什么现在很多人会去骑共享单车而不是自己买一辆自行车呢?
其实原因很简单,既方便又省钱。所以这种借方法用一下的原因也是一样的,既可以完成需求,又节省了内存。
下面的例子,admin
定义了一个 writeName
方法,但是 user1
和 user2
却没有,而他们还想用,怎么办呢?我们借一下。
注:user1
和 user2
通过改变 this
的指向借用了 admin
的方法,所以此时 this
是指向 user1
和 user2
的,因此打印出来的为他们各自的名字(就好像上一个例子,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
(默认为全局对象) ; - 后面则是一串参数列表。