怎样明白和闇练应用js中的call及apply

要邃晓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 这个数组来方便一切的参数。

这些的话也就可以邃晓它俩的用途以及它们定义。

我也是从知乎大牛的回复内里看到然后总结下来的。

    原文作者:Ray_
    原文地址: https://segmentfault.com/a/1190000008327856
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞