2010-01-29 21 views
5

基本上我試圖理解和學習JavaScript中的'this'關鍵字的工作原理。'這個'關鍵字是指一個函數內的另一個函數內的對象?

據我所知'this'指的是它在那個時刻內的對象(函數)。

所以,通過這個相信,我想測試下面的簡單代碼的輸出:

<body> 

<input type="button" value="Add Age" onclick="Outer()" /> 

<script type="text/javascript"> 

function Outer(){ 

if(typeof this.Father == 'undefined') 
    { 
     this.Father = 0; 
    } 

this.Father+=2; 
alert(this.Father); 

inner(); 

     function inner(){ 
      if(typeof this.Son== 'undefined') 
      { 
       this.Son = 0; 
      }; 

      this.Son++; 
      alert(this.Son); 
      alert(this.Father); 
     }; 
}; 
</script> 
</body> 

,其輸出混淆了我。因爲在inner()函數中,this.Son輸出Son的遞增整數值。但我期待this.Father失敗,因爲inner()沒有.Father屬性。但是,而不是拋出異常它提醒this.Father哪位的值似乎

  • 以上「這」是指內()
  • 和下面的行「本」是指外()
一個線

在這一點上,我在我的腦海actualy 2個問題:

  1. 是「這個」關鍵字總是指 甚至裏面的內部函數外部範圍的住房?

  2. 而沒有任何聲明'this'的關鍵字引用了該方法中的內容? (我的意思,而不必東西LIK var myFamily = new Outer()

謝謝,

布拉克ozdogan

回答

5

this由調用模式確定的,即,怎樣的功能對象被調用。

有4種不同類型的調用模式:

  1. 方法調用:函數被定義爲一些對象的屬性,並使用細化通過對象被調用,即,.

    a.func(); // this涉及該對象,即a

  2. 函數調用:純函數調用。

    func(); // this綁定到全局對象。

  3. 構造函數調用:好吧,它有點複雜。由於構造函數被用作新函數對象的構造函數方法,因此new,this引用了正在創建的新函數對象。

    var func = new Func(); // thisfunc而在Func構造函數)

  4. 應用調用:

    func.apply(thisArg,必要參數); // this是鍵合到第一個參數

換句話說,在您的示例this所有指全局對象(您的呼叫onClickOther())。您應該嘗試使用new Other()

+0

謝謝,這是非常有用的信息。 你可以在這篇文章中找到更多關於調用模式的內容: http://mcarthurgfx.com/blog/article/4-ways-functions-mess-with-this – pencilCake 2010-01-29 12:27:42

+0

而且這一點也相當具有說明性:函數調用在JavaScript - 上下文重訪 - http://msmvps.com/blogs/luisabreu/archive/2009/08/24/function-invocation-in-javascript-contexts-revisited.aspx – pencilCake 2010-01-29 14:38:26

相關問題