使用call()、apply()、bind()方法调用函数时,都会把函数里面的this指向他们的第一个参数。
不同点。
- 参数不同。call()、bind()的参数一样。第一个参数是this指向的对象,从第二个起,传递的是调用函数的参数。apply()的第二个参数是需要调用的函数的参数数组。
- 执行不同。call()、apply()是马上执行。bind()是返回一个函数,调用的时候才执行。
例子1:普通调用。
这里实际上是window调用test方法。所以test里面的this指向window。
function test(data) {
console.log(this,data);
}
test("12");//这里实际上是window调用test方法。所以test里面的this指向window。
例子2:call、apply调用。
var obj = {username:"张三"};
function test(data) {
console.log(this,data);
}
//这里使用call方法调用test函数,强行把test函数的this改变为第一个参数obj
test.call(obj,222);
//用apply方法调用test函数,强行把test函数的this改变为第一个参数obj
test.apply(obj,[222]);
上面的代码,test方法打印的this,就是上面的obj对象。
例子3:bind。
bind会返回一个函数,函数的this执行bind的第一个参数。并且bind不会马上执行函数。需要去调用。
var obj = {username:"张三"};
function test(data) {
console.log(this,data);
}
//使用bind把test函数的this改变为obj,并且返回新的函数。并不会立即执行函数
var bind_test = test.bind(obj,33);
bind_test();//调用bind之后的新函数
test.bind(obj,444)();//相当于上面的2行代码。立即调用
setTimeout(function (data) {
console.log(this,data);
}.bind(obj,555),1000)
上面的代码 test.bind(obj,444)() 使用bind返回一个函数之后,加上括号。表示马上调用。