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的方式巧妙地解决这个问题!

           

               

               

 

 

 

posted @ 2013-11-04 15:25  廖凯林  阅读(505)  评论(0编辑  收藏  举报