標籤:
首先說明一下,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()兩個函數的一點個人看法