javascript中call、apply、bind这三个方法的作用都是改变执行环境中this指针的指向。
call()与apply()
这两个方法第一个参数都为this指针指向的目标对象,它们的区别是第二个参数开始传参方式不同。
call传参:obj,arg2,arg3
apply传参:obj,[arg2,arg3,…]
function foo(a,b){
return this.value + a + b;
}
var obj = {
value: 1
}
//call
foo.call(obj,2,3); //6
//apply
foo.apply(obj,[2,3]); //6
//call()与apply()如果第一个参数不是对象类型,那么这个参数会被自动转化为对象类型
function foo2(){
console.log(Object.prototype.toString.call(this));
}
foo2.call(2); //[object Number]
bind()
第一个参数为this指针指向的目标对象,bind方法执行后返回的是一个新函数
function foo3(){
console.log(this.name);
}
var obj3 = {
name: '张三'
}
var f = foo3.bind(obj3);
f(); // 张三
//在f这个新的函数对象中,this被永久绑定到了bind的第一个参数上面,无论后期这个新的函数被如何使用this都不会改变。
var obj4 = {
name: '李四',
f:f
}
obj4.f(); // 张三
call()与apply()与bind()
如果这个三个方法都没有提供第一个参数或参数是this、null、undefined中的一种,那么都将默认第一个参数为Global对象 。
function foo3(){
console.log(Object.prototype.toString.call(this));
}
foo3.call(); //[object Window]
foo3.apply(); //[object Window]
foo3.bind(); //[object Window]