zoukankan      html  css  js  c++  java
  • js中的apply call 操作小结(参考自网络)

    1、方法定义

        call方法:

          语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

                 定义:调用一个对象的一个方法,以另一个对象替换当前对象

                 说明: call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供                            thisObj 参数,那么 Global 对象被用作 thisObj。

         apply方法:

                 语法:apply([thisObj[,argArray]])

                 定义:应用某一对象的一个方法,用另一个对象替换当前对象.

                 说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,

             那么Global 对象将被用作 thisObj, 并且无法被传递任何参数。

                  apply 有个特点:可以将一个数组默认的转换为一个参数列表([params]) 转换为 param1,param2,param3) 

    call  和 apply的区别就是 apply传递的必须是一个数组,call是一个类似java中的可变参数

    经典的案例:

             1.   function add(a,b){

                               return a+b ;

                           }

                function sub(a,b){

                              return a-b ;

                           }

                add.call(sub,1,2) ; 返回的结果为3 ,通过add方法来替换sub的上下文,实际上调用的是add

             2.继承的另外一种实现

                   function Person(name){

                            this.name = name;

                            this.showName = function(){

                                alert(this.name) ;

            }

                      }

                   function ZS(name){

                            Person.call(this,name) ;

                 }

                    var zs = new ZS("zhangsan") ;

                     zs.showName() ;

                   打印zhangsan的信息,通过Person.call(this,name) 将Person对象代替this对象

          3.apply的特殊用法     

        a)Math.max 可以实现得到数组中最大的一项

        因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组    

        但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法)

                   这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去

        b)  Math.min  可以实现得到数组中最小的一项

                     同样和 max是一个思想 var min=Math.min.apply(null,array);

        c)   Array.prototype.push 可以实现两个数组合并

    同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即:

    [javascript] view plaincopy
    1. vararr1=new Array("1","2","3");  
    2.   
    3. vararr2=new Array("4","5","6");  
    4.   
    5. Array.prototype.push.apply(arr1,arr2);  

     

    也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.

    通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:

    一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地解决这个问题!

               

                   

                   

  • 相关阅读:
    mysql limit
    random.nextint()
    “MSDTC 事务的导入失败: Result Code = 0x8004d00e。
    JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    iOS ERROR: unable to get the receiver data from the DB 解决方式
    STL algorithm算法mov,move_backward(38)
    看 《一次谷歌面试趣事》 后感
    C++胜者树
    拿年终奖前跳槽,你才是赢家!
    日期字符串格式化成日期/日期格式化成指定格式字符串
  • 原文地址:https://www.cnblogs.com/liaokailin/p/3406607.html
Copyright © 2011-2022 走看看