美文网首页
call()和apply()

call()和apply()

作者: _v_xw | 来源:发表于2017-02-06 11:29 被阅读0次

    先了解为什么要使用call,apply这些方法

    1. 例子
    function cat(){ //函数声明
    }
    cat.prototype={ //定义其方法
    food:"fish",
    say: function(){
    alert("I love "+this.food);
    }
    }
    var blackCat = new cat;
    blackCat.say();
    
    1. 意外
      如果这个时候出现了一个对象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下的所有方法了。

    参考
    作者:杨志
    链接:https://www.zhihu.com/question/20289071/answer/14644278

    区别

    二者的作用完全一样,只是接受参数的方式不太一样。

    obj.call(thisObj, arg1, arg2, ...);
    obj.apply(thisObj, [arg1, arg2, ...]);
    

    先理解下这句话的正确与否

    1. 作用的确都一样,为了改变函数体内部 this 的指向
    2. 接受的参数的区别
      apply接受的是数组参数,call接受的是连续参数

    按照上面分析那么这句话就是正确的。

    但是实际上二者还是有区别的

    就是性能上的区别,在一般的框架应用中的源代码,
    会使用swich来判断使用call,还是apply;

    一般参数个数小的情况下(<4||5)使用call
    然后default 剩下的用apply方法

    可能是出于性能问题,反正不能说他们完全一样啊嘛,虽然功能相同但是能力不同呀
    或者是因为call的参数必须一个一个列举出来所以,参数个数多了就直接用apply的方法
    完全是取决于你采用哪种给函数传递参数的方式最方便。
    在JS的高级程序设计第三版的P117有些许解释这两个方法在何时使用比较恰当。

    相关文章

      网友评论

          本文标题:call()和apply()

          本文链接:https://www.haomeiwen.com/subject/ypvyittx.html