JS中的call()方法和apply()方法

共同點:

        call()方法和apply()方法是每個函數非繼承而來的方法,並且這兩個方法的作用都是一樣的。

不同點:               

        apply():

                apply方法能劫持另外一個對象的方法,繼承另外一個對象的屬性。

  1. Function.apply(obj,args)方法能接收兩個參數

  2. obj:這個對象將代替Function類裏this對象,函數運行的作用域

  3. args:這個是數組,它將作爲參數傳給Function(args-->arguments)

  4. apply的一個巧妙的用處,可以將一個數組默認的轉換爲一個參數列表([param1,param2,param3] 轉換爲 param1,param2,param3。

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:Array.prototype.push 可以實現兩個數組合並

同樣push方法沒有提供push一個數組,但是它提供了push(param1,param,…paramN) 所以同樣也可以通過apply來裝換一下這個數組,即:

vararr1=new Array("1","2","3");

vararr2=new Array("4","5","6");

Array.prototype.push.apply(arr1,arr2);

也可以這樣理解,arr1調用了push方法,參數是通過apply將數組裝換爲參數列表的集合.

通常在什麼情況下,可以使用apply類似Math.min等之類的特殊用法:一般在目標函數只需要n個參數列表,而不接收一個數組的形式([param1[,param2[,…[,paramN]]]]),可以通過apply的方式巧妙地解決這個問題!

 

        call():

                call方法與apply方法類似。

  1. Function.call(obj,[param1[,param2[,…[,paramN]]]])

  2. obj:這個對象將代替Function類裏this對象

  3. params:這個是一個參數列表

    <script>
        window.firstName = "Cynthia"; 
        window.lastName = "_xie";

        var myObject = {firstName:'my', lastName:'Object'};

        function getName(){
            console.log(this.firstName + this.lastName);
        }

        function getMessage(sex,age){
            console.log(this.firstName + this.lastName + " 性別: " + sex + " age: " + age );
        }

        getName.call(window); // Cynthia_xie
        getName.call(myObject); // myObject

        getName.apply(window); // Cynthia_xie
        getName.apply(myObject);// myObject

        getMessage.call(window,"女",21); //Cynthia_xie 性別: 女 age: 21
        getMessage.apply(window,["女",21]); // Cynthia_xie 性別: 女 age: 21

        getMessage.call(myObject,"未知",22); //myObject 性別: 未知 age: 22
        getMessage.apply(myObject,["未知",22]); // myObject 性別: 未知 age: 22

    </script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章