• 浅谈call和apply的联系&区别&应用匹配


      call和apply的联系和区别在之前查过资料了解了一番,昨天晚上睡不着觉忽然想到了这个问题,发现对于他们的联系和区别理解的还是很模糊。看来还是欠缺整理,知识没有连贯起来。反思一二,详情如下:

    1作用(联系)

    这两个方法都能够劫持另外一个对象的方法,继承另外一个对象的属性。就是借用别人的方法来做自己的事情。

    functionName.call(this, arg1,arg2,arg3)==functionName.apply(this, arguments)==this.functionName(arg1, arg2, arg3)

    2用法(区别)

    2.1用法和区别

      还得看 functionName.call(this, arg1,arg2,arg3)==functionName.apply(this, arguments)==this.functionName(arg1, arg2, arg3);

    看得出他们的作用是完全相同的,不同的只是参数的传递形式不同。

    call属于刘备的性格,窘迫之中不忘其从容淡定----喜欢一个一个的传递参数给借来的方法做参数(),而apply则是张飞的性格,急脾气,做事情慢不得----一个一个的传参真是愁煞人~好吧,我要把参数放在一个数组里,直接传数组岂不快哉?

    2.2情景再现:

    具体什么情况下使用apply,什么情况下使用call呢?

    在给对象参数的情况下,如果参数的形式是数组的时候,那最好使用apply;但是如果我们碰到类似要把一些不同的属性传参的时候,eg:Person.call(this,age,name,grde);那么使用call来传参无疑是不二首选,因为Person需要的不是一个数组。

    2.3 Skills in apply

    读完2.2后大家肯定会想那么一个问题,如果我们需要的是非数组参数,但是却使用apply传递了一个数组,这样会出现什么反应呢?

    答:张飞粗中有细,根据需要,把数组解析成了一个一个的参数。

    这一绝技如果用普通方法转换的话就得小费功夫了,so,apply可以效力数组转化~

    eg:  var max=Math.max.apply(null,arguments),同理适于求数组中最小数

    据说对于程序员简单的代码比任何语言都具有说法力,不知是不是真的:

     1 <!DOCTYPE html>
     2 <html>
     3 <head lang="en">
     4     <meta charset="UTF-8">
     5     <title></title>
     6     <script>
     7         function print(a,b,c,d){
     8             alert(a+b+c+d);
     9         }
    10         function test(a,b,c,d){
    11             print.call(this,a,b,c,d);
    12             print.apply(this,arguments);
    13             print.apply(this,[a,b,c,d]);
    14         }
    15         var arr=[e,b,c,d];
    16         test("云在","青天","水在","");
    17         //参数明确时可用call,不明确时用apply结合arguments
    18         print.call(window,"云在","青天","水在","");
    19 
    20     </script>
    21 </head>
    22 <body>
    23 
    24 </body>
    25 </html>


     

    欢迎关注微信公众号:“花栗鼠的红松树” 知乎专栏:“花栗鼠的红松树” 知乎: 卓怡 https://www.zhihu.com/people/zhuoyisun/activities
  • 相关阅读:
    js检测对象中是否存在某个属性
    ES6 笔记
    DataSet 用法
    CommandBehavior.CloseConnection有何作用
    SqlDataReader
    Listview.Finditem()函数用法
    Instr()函数用法
    StringBuilder与StringBuffer的区别
    [DllImport("kernel32.dll")]使用
    extern用法
  • 原文地址:https://www.cnblogs.com/s-z-y/p/4459808.html
Copyright © 2020-2023  润新知