2013-04-05 73 views
6

我對JavaScript this參考情況感到困惑。JavaScript這是指窗口而不是對象內部函數

我正在處理一個代碼,我在對象方法中聲明函數。 (原因是要清理對象方法中的代碼,同時保持函數對該方法是私有的。)

以下是重新生成我的問題的實驗。

我發現裏面this功能greeting指的是窗口範圍,而不是範圍。

var person = { 
    nickname: "Makzan", 
    sayHi: function() { 
     console.log(this); 
     var greeting = function() { 
      console.log(this); 
      return "Aloha " + this.nickname; 
     } 
     console.log(greeting()); 
    } 
} 
person.sayHi(); 

(在相同的jsfiddle代碼:http://jsfiddle.net/makzan/z5Zmm/

而且這是在瀏覽器中的日誌結果:

> Object 
> Window 
Aloha undefined 

在JS,我知道,這參考是棘手。我可以通過使用.call方法來改變這個範圍,使這個代碼有效。

var greeting = (function() { 
    console.log(this); 
    return "Aloha " + this.nickname; 
}).call(this); 

不過,我很好奇地想知道爲什麼默認this窗口範圍問候方法裏面?

在此先感謝您的幫助。

+1

它是確定,因爲'greeting'被稱爲沒有上下文。 – 2013-04-05 10:28:51

+0

謝謝大家。我現在瞭解更多關於「背景」的含義。 – Makzan 2013-04-05 10:41:24

回答

6

this無關與範圍。它由上下文決定。

greeting()調用沒有上下文的函數,所以this是默認對象(window在瀏覽器中)。

2

嘗試person.nickname,這指的是VAR問候你的情況

4

this,引用與範圍無關,它取決於調用上下文。

作爲每MDN doc

一般地,在當前範圍綁定到該對象是 由當前功能如何被調用

相關問題