call、apply、bind都可以改变函数的执行上下文,换句话说就是都可以改变函数的this指向
call()
call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。当第一个参数为null、undefined的时候,默认指向window。
语法:function.call(thisArg,arg1,arg2,arg3,....)
var array = ['a', 'b'];
var elements = [0, 1, 2];
array.push.apply(array, 0,1,2);
console.log(array); // ["a", "b", 0, 1, 2]
在一个子构造函数中,你可以通过调用父构造函数的 call 方法来实现继承,使用call()可以提高代码的复用性,如下Product.call()使通过Toy构造函数创建的实例对象fun也拥有了name、price属性实现了继承
function Product(name, price) {
this.name = name
this.price = price
}
function Toy(name, price) {
Product.call(this, name, price)
this.category = 'toy'
}
var fun = new Toy('robot', 40)
apply()
apply() 方法使用一个指定的 this 值和作为一个数组或类似数组对象提供的参数
来调用一个函数。当第一个参数为null、undefined的时候,默认指向window。
语法:func.apply(thisArg, [argsArray])
var array = ['a', 'b'];
var elements = [0, 1, 2];
array.push.apply(array, elements);
console.log(array); // ["a", "b", 0, 1, 2]
bind()
bind()创建一个新的函数,在bind()被调用时将函数内的this指向bind内的第一个参数
语法:function.bind(thisArg[, arg1[, arg2[, ...]]])
总结:
- call、apply、bind共同点是都可以改变函数内this指向
- call、apply、bind的第一个参数都指定函数内的this指向,call后面的参数可以为1个或者多个,apply的参数为一个数组,bind后为函数内传入的参数
- call、apply都是立即执行函数,bind为新建函数后等待调用再执行
网友评论