今天遇到一道关于call与apply使用的题目,在此总结一下关于 call 与 apply 的使用方法。
题目如下:以下程序执行结果为3的选项是?
var a = {X:1,Y:2};
var b = {
X:2,
Y:2,
add:function(){
return this.X+ this.Y;
}
};
console.log(b.add.call(a)); //3
console.log(b.add.apply(a)); //3
console.log(b.excute('1+3')); //报错
console.log(b.add.bind(a)); //返回函数
题目解析:
console.log(b.add.call(a));
通过call(obj)方法将对象b的add方法添加到对象a下。此时a对象为:
var a = {
X:2,
Y:2,
add:function(){
return this.X+ this.Y;
}
};
因此,很好理解执行结果为3了。console.log(b.add.apply(a));
在此时与以上方法相同,它们的区别写在后面。
console.log(b.excute(‘1+3’));
对象b下没有excute这个方法,则报错。
console.log(b.add.bind(a));
此方法将b.add()方法绑定在a下,相当于为a添加了add()方法,但是不是真的复制,执行a.add()也会显示在对象a下找不到add方法。要想显示结果3,可修改为console.log(b.add.bind(a)())。
call 与 apply 方法解读
call 与 apply 都存在于这样的环境下,对象a想要使用对象b中方法,自己比较懒,不想再新建,就出现了call和apply方法,直接使用对象b的方法。
定义:
调用一个对象的一个方法,以另一个对象替换当前对象。区别
根据方法格式就可以看出区别啦!
call([thisObj[,arg1[, arg2[,[,.argN]]]]]);
apply([thisObj[,argArray]]);区别在于 apply的第二个参数必须是数组或者arguments(参数数组)。call 的第二个参数可以是任意类型,如果为方法传递多个参数,call方法必须逐个制定参数。
3.说明
在call 方法中,如果没有提供 thisObj 参数,那么全局对象被用作 thisObj。
在apply方法中,如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 全局对象将被用作 thisObj, 并且无法被传递任何参数。
4.bind()方法
看到一篇总结的比较好的文章,点开了解详细信息吧!Javascript中bind()方法的使用与实现