要邃晓call以及apply 起首得晓得他们的用法怎样有什么用
function cat() {}
cat.prototype = {
food: "fish",
say: function () {
alert("I love " + this.food);
}
}
var blackCat = new cat;
blackCat.say();
然则假如我们有一个对象whiteDog = {food:”bone”},我们不想对它从新定义say要领,那末我们能够经由过程call或apply用blackCat的say要领:blackCat.say.call(whiteDog);
所以,能够看出call和apply是为了动态转变this而涌现的,当一个object没有某个要领,然则其他的有,我们能够借助call或apply用别的对象的要领来操纵。
用的比较多的,经由过程document.getElementsByTagName挑选的dom 节点是一种相似array的array。它不能运用Array下的push,pop等要领。我们能够经由过程:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName(“*”));
如许domNodes就可以够运用Array下的一切要领了。
call 和 apply 都是为了转变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了转变函数体内部 this 的指向。由于 JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是能够转变的」如许的观点。
两者的作用完整一样,只是接收参数的体式格局不太一样。比方,有一个函数 func1 定义以下:
var func1 = function(arg1, arg2) {};
就可以够经由过程 func1.call(this, arg1, arg2); 或许 func1.apply(this, [arg1, arg2]); 来挪用。个中 this 是你想指定的上下文,他能够任何一个 JavaScript 对象(JavaScript 中一切皆对象),call 需要把参数按递次通报进去,而 apply 则是把参数放在数组里。
JavaScript 中,某个函数的参数数目是不牢固的,因而要说实用前提的话,当你的参数是明白晓得数目时,用 call,而不确定的时刻,用 apply,然后把参数 push 进数组通报进去。当参数数目不确定时,函数内部也能够经由过程 arguments 这个数组来方便一切的参数。
这些的话也就可以邃晓它俩的用途以及它们定义。
我也是从知乎大牛的回复内里看到然后总结下来的。