call()和apply()
- 这两个方法都是函数对象的方法,需要通过函数对象来调用
- 当对函数调用call()和apply()都会调用函数执行
- 在调用call()和apply()可以将一个对象指定为第一个参数
此时这个对象将会成为函数执行时的this
- call()方法可以将实参在对象之后依次传递
- apply()方法需要将实参封装到一个数组中统一传递
bind()
Function.prototype.bind(obj)
将函数内的this绑定为obj, 并将函数返回,传参方式和call()一样
在定时器中this指向window,如果要改变this指向,只能用bind(),因为不会立即执行函数,
如果用call()或者apply()会立即调用函数
call()/apply()/bind()三者的区别
call()/apply()是立即调用函数
bind()是将函数返回
- this的情况:
1.以函数形式调用时,this永远都是window
2.以方法的形式调用时,this是调用方法的对象
3.以构造函数的形式调用时,this是新创建的那个对象
4.使用call和apply调用时,this是指定的那个对象
function fun(a, b) {
console.log("a = " + a);
console.log("b = " + b);
//alert(this);
}
var obj = {
name: "obj",
sayName: function() {
alert(this.name);
}
};
var obj2 = {
name: 'obj2'
};
function foo(data){
console.log(this,data)
}
foo.bind(obj,33)();
setTimeout(function() {
console.log(this)
}.bind(obj), 1000);
//fun.call(obj,2,3);
fun.apply(obj, [2, 3]);
obj.sayName.apply(obj2) // obj2