var scope = 'global';函數
var f = function() {spa
console.log(scope); // 輸出 undefined ip
var scope = 'f';作用域
}io
f();console
【解析】上面代碼可能和你預想的不同,沒有輸出 global, 而是undefined,這是爲何呢?這是 JavaScript 的一個特性,按照做用域搜索順序,在 console.log 函數訪問 scope 變
量時, JavaScript 會先搜索函數 f 的做用域,恰巧在 f 做用域裏面搜索到 scope 變量,
因此上層做用域中定義的 scope 就被屏蔽了,但執行到 console.log 語句時, scope 還
沒被定義,或者說初始化,因此獲得的就是 undefined 值了。function
函數做用域的嵌套變量
有一點須要注意:函數做用域的嵌套關係是定義時決定的,而不是調用時決定的,也就
是說, JavaScript 的做用域是靜態做用域,又叫詞法做用域,這是由於做用域的嵌套關係可
以在語法分析時肯定,而沒必要等到運行時肯定。搜索
var scope = 'top';
var f1 = function() {
console.log(scope);
};
f1(); // 輸出 top
var f2 = function() {
var scope = 'f2';
f1();
};
f2(); // 輸出 top語法
【解析】這個例子中,經過 f2 調用的 f1 在查找 scope 定義時,找到的是父做用域中定義
的 scope 變量,而不是 f2 中定義的 scope 變量。這說明了做用域的嵌套關係不是在調用 時肯定的,而是在定義時肯定的。