要领call()、apply()、bind()都保存在函数的prototype名下(因而每一个函数都能够直接挪用)。都用于转变函数的实行环境。
call()和apply()
call()和apply()现实功用一致。
call()和apply()在原函数具有参数的时刻,不能只要一个参数了。
function add(num1,num2){
console.log(num1+num2);
}
function show(num1,num2){
return add.call(null,num1,2);
}
show(2,3); //输出效果为4
function add(num1,num2){
console.log(num1+num2);
}
function show(num1,num2){
return add.call(null,num1);
}
show(2,3); //输出效果为NAN
在非严厉情势下,call(null) 等价于 call(this) 和 call(undefined)
call()必需把函数参数写全,不然没法准确运转。
apply()能够理解为,第二个参数假如须要,必需传入悉数参数构成的一个数组,或许arguments。
bind()
call()和apply()是直接挪用,而bind()的作用:建立一个函数的实例,实行环境变成bind的参数。对的,只是建立一个函数实例,因而平常须要以值的情势通报之。
var cat = {color:"blue"};
window.color = "red";
function showColor(){
console.log(this.color);
}
showColor.bind(cat); //没有任何输出
showColor.bind(cat)(); //输出blue
var newShowColor = showColor.bind(cat);
newShowColor(); //输出blue
bind()可用于setTimeout()、setInterval()或许事宜处置惩罚(document),被绑定的函数也会用掉更多的内存。
自定义的bind()
function bind(fn,arg){
return function(){
return fn.apply(arg,arguments);
}
}
这里的arg是实行环境对象,arguments是fn函数自身的参数。
bind(showColor,cat);等价于showColor.bind(cat);