對於很多初學者,this總是搞得我們暈頭轉向。 現在,我就簡單的總結一下關於this的那點事。 this在函數定義時經常是不能確定的,只有在函數執行的時候才能最終確定this的歸屬。this總是指向最後調用它的對象,那麼怎麼知道到底是誰調用的呢?其實很簡單,我們知道函數調用的其中一種方法就是利用ca ...
對於很多初學者,this總是搞得我們暈頭轉向。
現在,我就簡單的總結一下關於this的那點事。
this在函數定義時經常是不能確定的,只有在函數執行的時候才能最終確定this的歸屬。this總是指向最後調用它的對象,那麼怎麼知道到底是誰調用的呢?其實很簡單,我們知道函數調用的其中一種方法就是利用call.下麵就來簡單的分析一下怎麼利用call來判斷調用函數的對象到底是何方神聖。
先來看看call是怎麼來使用的:
fun.call(thisArg, arg1, arg2, ...)
thisArg:
在fun
函數運行時指定的this
值。
需要註意的是,指定的this
值並不一定是該函數執行時真正的this
值,如果這個函數處於非嚴格模式下,則指定為null
和undefined
的this值會自動指向
全局對象(瀏覽器中就是window對象),同時值為原始值(數字,字元串,布爾值)的this
會指向該原始值的自動包裝對象。
arg1, arg2, ...:
指定的參數列表。
知道了call的用法,就可以開始this的分析之旅了。
例子1:
function test() { var name = 'test'; console.log(this.name); //undefined } test();
test() 等價於 test.call(undefined) ,這時的thisArg為undefined,所以this指向全局對象(瀏覽器中為window對象),所以this.name為undefined。
例子2:
1 var obj = { 2 name: 'tang', 3 func: function () { 4 var name = 'func'; 5 console.log(this.name); 6 } 7 }; 8 var test1 = obj.func();//tang 9 var test2 = obj.func; 10 obj.func(); //tang 11 test2(); //undefined
第8行 test1=obj.func(),賦值時執行函數,obj.func()等價於obj.func.call(obj),thisArg為obj,this指向obj,this.name為tang;
第10行obj.func() 等價於 obj.func.call(obj) ,這時的thisArg為obj,即this指向obj,所以this.name即為tang;
第11行test2()等價於test2.call(undefined),所以this指向全局對象(瀏覽器中是window);
第8行和第9行的區別在於賦值的時候有沒有運行函數,第8行賦值的就運行函數,所以this指向obj,而第9行賦值時沒有運行函數,只是把函數賦值給test2,所以this的指向還得等調用函數時才能確定,在第11行調用函數時才能確定。