關於js的call()和apply()兩個函數的一點個人看法

來源:互聯網
上載者:User

標籤:


首先說明一下,call()和apply都是js的內建函數

它的作用是:改變call或者apply函數裡面的``第一個參數對象``的指標,使它轉向引用它的函數

call()的用法,call(對象,參數1,參數2,······)

apply()的用法,apply(對象,數組參數)

call()和apply()的區別是:call對象後面的參數是字串,而apply對象後面的參數是數組

換一句話就是說:改變第一個參數對象的this,使它指向引用它的函數

例子:
函數func.call(obj,arg2,arg3)
這個例子的意思就是:
call把第一個參數,obj對象的this指向func的this,並向func函數傳遞參數arg1,arg2

針對第一個參數obj,這裡再解釋一下:
【obj:這個是對象,也可以是函數,如果是函數,call方法最終會解析成``構成這個函數的對象``,有人也把這個說成是函數的上下文環境】
下面我們來做實驗:

 

 //構建全域對象的add函數    function add(a,b){        alert(a+b);    }    var obj={        };    //構建以obj為對象的add函數,注意這裡的函數體是:  a*b,以表明與上面的add的不同    obj.add=function(a,b){        alert(a*b);    }    obj.sub=function(a,b){        alert(a/b);    }    //構建sub函數    function sub(a,b){        alert(a-b);    }    obj.arg1=function(){        alert(a%b);    }    obj.arg2=function(a,b){        alert(a%b);    }    function arg(){            }    //實驗1    obj.add.call(add,1,2);//結果為:2    obj.add.call(window.add,1,2);//結果為:2    obj.add.call(window,1,2);//結果為:2    //實驗2    add.call(obj.add,1,2);//結果為:3    add.call(obj,1,2);//結果為3    add.call(window,1,2);//結果為3    //實驗3    sub.call(add,1,2);//結果為-1    sub.call(window.add,1,2);//結果為-1    sub.call(obj.add,1,2);//結果為-1    //實驗4    add.call(sub,1,2);//結果為3    add.call(window.sub,1,2);//結果為3    add.call(obj.sub,1,2);//結果為3    //實驗6    obj.call(sub,1,2);    //Uncaught TypeError: obj.call is not a function(anonymous function)     window.call(sub,1,2);    //Uncaught TypeError: window.call is not a function(anonymous function)    //實驗7    obj.arg1.call(add,1,2);    //Uncaught ReferenceError: a is not defined    obj.arg2.call(arg,1,2);//結果:1  

實驗1、2、3、4、5、7作對照:

得出結論:call方法的第一個參數為對象,其餘參數的為傳進去``對象``方法裡面的值

實驗6:得出結論,call只是``函數``的一個方法,引用它的必須為``函數``,``對象``引用它會報錯

結後語:

如果我上面的結論正確,那麼下面的執行下面的函數和結果應該是:

obj.sub.call(sub,1,2);//結果:0.5
obj.sub.call(window.sub,1,2);//結果:0.5
obj.sub.call(window,1,2);//結果:0.5

大家可以做一下實驗,以驗證我的結論

關於js的call()和apply()兩個函數的一點個人看法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.