2012-10-17 61 views
1

的情況讓看到代碼第一關於JavaScript閉合和匿名功能

var name = "The Window"; 
var object = { 
    name : "My Object", 
    getNameFunc : function(){ 
    return function(){ 
     return this.name; 
    }; 
    } 
}; 

alert(object.getNameFunc()()); 

結果爲"The Window"; 我想知道每一步發生了什麼。 我認爲this是指向調用這個函數的對象;對? 但是,爲什麼在這種情況下thiswindow

回答

1

第二個函數調用不會發生從一個對象的上下文,而是從功能,從第一個調用返回。

由於沒有對象上下文,所以this的值與其他函數一樣成爲默認window

// v-----------------v------function has context 
alert(object.getNameFunc()()); 
      // -----------^----second function was returned from the first 
      //     and invoked so there's no object context 

如果我們不是分配返回的功能object,然後從上下文中調用它,this將被以object參考。

obj.foo = object.getNameFunc(); 
obj.foo(); // "My Object" 

完全相同的功能,但現在它正從爲object一個屬性,它含蓄地將其this價值object調用。


this規則真的非常簡單和容易理解,但可能不是你所期望的第一什麼。

this值非常動態,完全基於如何調用函數。

foo();   // 'this' is 'window' 

object.foo();  // 'this' is 'object' 

foo.call(object); // 'this' is 'object' 
foo.apply(object);// 'this' is 'object' 

var bar = foo.bind(object); 
bar();   // 'this' is 'object' 

所以你可以看到,默認爲window當函數沒有任何類型的連接到另一個對象的調用。

但是,當我們將函數作爲對象的屬性調用時,this突然引用該對象。

或者我們可以使用.call,.apply.bind來手動設置函數調用的this值。

+0

如果沒有對象上下文,則此值將成爲默認窗口。謝謝 – SeasonHuang

+0

不客氣。 –

1

由於這是一個新的封閉,所以this的含義丟失了。 this一直是一個棘手的事情來處理,所以我更喜歡總是用var that = this開始這樣的功能,以確保意義不會在關閉內丟失。

+0

感謝您的建議。 – SeasonHuang