他們之間有什麼區別?
①function的範圍 - >②[[範圍]] ---->③scope關於JavaScript範圍連鎖店
var scope = 'window';
var someFunction = function(){
something go here....
}
someFunction的範圍
someFunction [[範圍]]
窗口範圍
是嗎?
他們之間有什麼區別?
①function的範圍 - >②[[範圍]] ---->③scope關於JavaScript範圍連鎖店
var scope = 'window';
var someFunction = function(){
something go here....
}
someFunction的範圍
someFunction [[範圍]]
窗口範圍
是嗎?
如果您想了解範圍鏈,您應該閱讀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();
}
所以當富()被調用,然後調用巴(),現在弗雷德是針對首次欄的變量對象,那麼富的,然後解決全局對象。
一旦你瞭解執行上下文,你也會明白爲什麼調用的值這個「上下文」是一種誤導。
變量/激活對象從ES5開始稱爲*環境記錄*,而函數的[[Scope]]存儲它的*詞法環境*(它是所有者或*環境記錄*)。 – 2011-12-23 13:26:06
謝謝,必須深入到ES5,我現在有點懶惰,有點忽略它。但我想時間已經到來了。 – RobG 2011-12-24 04:11:58
請讓你的問題更清楚。我不知道你在問什麼。 Javascript中的變量既可以是本地的,也可以是全局的:沒有其他的可能性。 – 2011-12-23 10:49:58
在你的例子中,現在只有兩個「範圍」被稱爲詞法環境:(1)函數的範圍,(2)全局範圍。 – 2011-12-23 13:25:21