平时在写js代码中,当需要挪用某一个函数或许方式时,我们只需要在函数名称后背加个()并在括号中传入函数的参数就能够。let a = {
add: function (a, b) {
console.log(this);
console.log(a + b);
}
}
a.add(1, 2);
然则当此外一个对象b想挪用上面的add方式时,该若何做呢?这时我们就能够使用call和apply方式。let a = {
add: function (a, b) {
console.log(this);
console.log(a + b);
}
}
a.add(1, 2);
let b = {
x:5,
y:7
}
a.add.call(b,b.x,b.y)
我们在a.add方式后背挪用call方式,而且传入了3个参数,个中第一个参数为函数执行的上下文this,也就是函数执行的上下文由a酿成了b,后背的第2个和第三个参数是方式add的2个参数。事实上我们也经常使用call来挪用一个对象上不存在的方式,经由函数或许方式的挪用改变函数的执行上下文。apply方式和call雷同,只是传入的参数为数组类型。
那我们看看call和apply的出处。我们建立函数其实能够使用组织函数。var fn = new Function('console.log("a")');
fn();
然则这个方式相对函数表达式写法很复杂,并且还需要把字符串转换成js代码,所以执行效率也不高,所以很少如许写。然则如许写我们更轻易懂得call和apply的起原,其实Function作为一个函数也是有原型的,这个原型上也绑定了可供函数实例挪用的方式函数,个中就包含call和apply方式。