2011-12-23 70 views
0

他們之間有什麼區別?
①function的範圍 - >②[[範圍]] ---->③scope關於JavaScript範圍連鎖店

var scope = 'window'; 
var someFunction = function(){ 
    something go here.... 
} 

someFunction的範圍
someFunction [[範圍]]
窗口範圍
是嗎?

+2

請讓你的問題更清楚。我不知道你在問什麼。 Javascript中的變量既可以是本地的,也可以是全局的:沒有其他的可能性。 – 2011-12-23 10:49:58

+0

在你的例子中,現在只有兩個「範圍」被稱爲詞法環境:(1)函數的範圍,(2)全局範圍。 – 2011-12-23 13:25:21

回答

4

如果您想了解範圍鏈,您應該閱讀Richard Cornford的文章JavaScript Closures,特別是Identifier Resolution, Execution Contexts and scope chains上的部分。

簡而言之,作用域鏈從可變/激活對象傳播到變量/激活對象,停止在全局對象(因爲全局對象實際上是全局執行上下文的激活/變量對象)。因此,在的情況下

var fred; 

function foo() { 
    alert(fred); 
} 

標識符fred的由全局變量/激活對象(其在全球碼的情況下是全球客體本身)的屬性。當調用foo()時,將使用包含全局對象的作用域鏈創建新的變量/激活對象。標識符fred首先在內部變量對象上解析,並且由於它不會在那裏找到,因此將搜索鏈上的下一個對象(全局對象)。

同樣爲:

function foo() { 
    function bar() { 
     alert(fred); 
    } 
    bar(); 
} 

所以當富()被調用,然後調用巴(),現在弗雷德是針對首次欄的變量對象,那麼富的,然後解決全局對象。

一旦你瞭解執行上下文,你也會明白爲什麼調用的值這個「上下文」是一種誤導。

+1

變量/激活對象從ES5開始稱爲*環境記錄*,而函數的[[Scope]]存儲它的*詞法環境*(它是所有者或*環境記錄*)。 – 2011-12-23 13:26:06

+0

謝謝,必須深入到ES5,我現在有點懶惰,有點忽略它。但我想時間已經到來了。 – RobG 2011-12-24 04:11:58