2012-03-22 15 views
2

我知道,頂級的功能是window對象的成員,這是一個事實,即this裏面他們指window一致。任何對象的非頂級函數成員?

但是對於非頂級功能,this仍然爲window,但它們不是window的成員!

下面是一些代碼:

function topLevel1() { 
    alert(this) 
} 

function topLevel2() { 
    function inner() { 
     alert(this) 
    } 

    inner() 
} 

topLevel1()    // alerts DOMWindow 
alert(window.topLevel1) // alerts text of topLevel1, as expected 

topLevel2()     // again, alerts DOMWindow 
alert(window.inner)   // undefined 
alert(window.topLevel2.inner) // undefined 
  1. 如果inner既不是的window也不是topLevel2成員,其成員是什麼呢?
  2. 它怎麼可能是它thiswindow,但它不是window的成員?
  3. 是不是在Javascript中的法律,如果this == owner,那麼當前的方法是通過owner.調用? (除特殊情況下,像構造函數,applycall等)

回答

2

同樣,函數的值this決定爲如何調用函數,而不是它的位置或設計方式。

如果你只是調用函數

foobar() 

隨時隨地在你的代碼,就這樣,它的this值將始終是window(非嚴格模式)或undefined(嚴格)。現在有很多方法可以修改this,如使用.apply(),.call().bind()來調用該函數。所有這些方法都可以讓您有機會修改給定函數的this值。此外,如果您使用new關鍵字調用函數,則this將會返回一個新創建的對象(該對象也會返回)。

所以,函數的位置告訴你零有關其背景或this

現在來回答您的具體問題:

  1. innertopLevel2(ES3)以上

  2. 描述

  3. Activation Object的成員,我想這就是還涵蓋上述

+0

比ks,現在對我來說很明顯。 – Fixpoint 2012-03-22 00:30:11

+0

雖然我不明白爲什麼JS不會允許使用'obj.f'語法來調用具有'this == obj'的命名函數'f'。 – Fixpoint 2012-03-22 00:31:52

+0

無視這一點,我明白了,'.'只適用於會員。 – Fixpoint 2012-03-22 00:32:14

1

this關鍵字的奇妙參考是:http://www.quirksmode.org/js/this.html

內部topLevel2內()函數()只可以是可見的,以topLevel2。這是一個範圍問題。這就是爲什麼你沒有定義。

相關問題