首先,为什么要使用call,apply,bind,原因是他们可以改变this指向
box.onclick = function(){
function fn(){
alert(this);
}
fn();
};
我们原本以为这里面的this指向的是box,然而却是Window。一般我们这样解决:
box.onclick = function(){
var _this = this;
function fn(){
alert(_this);
}
fn();
};
将this保存下来。
还有一些情况,有时我们想让伪数组也能够调用数组的一些方法,这时call、apply、bind就派上用场了。
我们先来解决第一个问题修复this指向。
box.onclick = function(){
function fn(){
console.log(this);
}
fn.call(this);
};
或者简写成
box.onclick = function(){
(function(){
console.log(this);
}.call(this)); //box
};
call和apply、bind都是用来改变this的指向的,但也有一些小小的差别。下面我们来看看它们的差别在哪:
function fn(a,b,c,d){
console.log(a,b,c,d);
}
//call
fn.call(null,1,2,3);
//apply
fn.apply(null,[1,2,3]);
//bind
var f = fn.bind(null,1,2,3); f(4);
结果如下: 1 2 3 undefined
1 2 3 undefined
1 2 3 4
call就是挨个传值,apply传一个数组,bind也是挨个传值,但和call和apply还有一些不同,使用call和apply会直接执行这个函数,而bind并不直接执行,而是将绑定好的this重新返回一个新函数,什么时候调用由你自己决定。