1、Funciton.prototype.call()
call()方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。语法如下:
function.call(x [,arguments…) )
call()方法的第一个参数传入重新指定的this对象,若function需要传入参数,则用逗号隔开
举例说明:
var name='apple',price=5;
var fruit = {
name:'pear',
price:4,
log:function(){console.log('furit:'+this.name+'|price:'+this.price); }
log2:function(a,b){console.log('furit:'+this.name+'|price:'+this.price+a+b); }
}
furit.log(); //furit:pear|price:4
furit.log.call(window) //furit:apple|price:5
furit.log2(3,2) //furit:pear|price:432
furit.log2.call(window,3,2) //furit:apple|price:532
上面例子可以看出,当直接执行函数 furit.log() 时,this指向的并非window对象,而是指向fruit对象。
若用call方法,则可将函数内的this从furit指向window。
若需要传入参数,如 furit.log2() 所示,可在指定this对象增加传入参数,用,
隔开。
参考:
Funciton.prototype.call()—MDN
2、Funciton.prototype.apply()
apply() 方法,语法如下:
function.apply(x ,[arg1,arg2…] )
举例说明:
var numbers = [5, 6, 2, 3, 7];
var max = Math.max.apply(window, numbers);
console.log(max); // 7
var min = Math.min.apply(window, numbers);
console.log(min); // 2
同call()方法,第一个参数传入this指向对象,但与call()方法不同的是,apply()方法使用数组传入参数。
参考:
Funciton.prototype.apply()—MDN
3、Funciton.prototype.bind()
bind()方法不同于以上两种方法,该方法将创建一个新的函数,在被调用时,函数的this被bind()的第一个参数指定,其余的参数将作为新函数的参数供调用时使用。
语法如下:
function.bind(x(, arg1, …))
举例说明
var x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
module.getX(); // 81
var retrieveX = module.getX;
retrieveX(); // 9
var boundGetX = retrieveX.bind(module);
typeof(boundGetX) //'function'
boundGetX(); // 81
boundGetX.call(window) //81
由以上例子,可以看出bind()方法的特点:
- bind()方法的返回值是一个函数,需要再次调用
- bind()方法新创建的函数,会直接更换this对象,且不可被call()重新指定