zoukankan      html  css  js  c++  java
  • 炒鸡简单的javaScript的call和apply方法

    解释一

    作者:杨志
    链接:https://www.zhihu.com/question/20289071/answer/14644278
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    要先明白存在call和apply的原因,才能记得牢一点: 在javascript OOP中,我们经常会这样定义:

    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下的所有方法了。
    其他的就不提了,讲多了反而迷惑。

    解释二

    作者:赵望野
    链接:https://www.zhihu.com/question/20289071/answer/14745394
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    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 这个数组来便利所有的参数。

    转自知乎,自个儿留着看,啧啧啧~~

  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/martinl/p/7088749.html
Copyright © 2011-2022 走看看