1. 程式人生 > >this的那點事

this的那點事

this指向 st2 開始 light pre 全局對象 很多 var 同時

對於很多初學者,this總是搞得我們暈頭轉向。

現在,我就簡單的總結一下關於this的那點事。

this在函數定義時經常是不能確定的,只有在函數執行的時候才能最終確定this的歸屬。this總是指向最後調用它的對象,那麽怎麽知道到底是誰調用的呢?其實很簡單,我們知道函數調用的其中一種方法就是利用call.下面就來簡單的分析一下怎麽利用call來判斷調用函數的對象到底是何方神聖。

先來看看call是怎麽來使用的:

fun.call(thisArg, arg1, arg2, ...)

  thisArgfun函數運行時指定的this需要註意的是,指定的this值並不一定是該函數執行時真正的this

值,如果這個函數處於非嚴格模式下,則指定為nullundefinedthis值會自動指向全局對象(瀏覽器中就是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行調用函數時才能確定。

this的那點事