前言
範圍鍊 Scope Chain 指的是:當函式內沒有需要的變數時,會向外尋找該變數的過程。
範圍鍊
前面的章節有提過,JS的作用域為語法作用域。
也就是說,作用域在函式撰寫完的時候,就已經被確定下來了,所以與執行堆疊以及執行環境並不會有任何直接關係,而這個尋找的過程就是所謂的範圍鍊
以下範例屬於在外層宣告,但內層卻可以取得。
無論是fn1或是fn2,範圍鍊都指向全域,這是因為原始碼撰寫結構的關係
因此 fu1() 並不會因為他是在 fu2() 下被呼叫而去尋找 fu2() 的 var value = 2;,
而是 fu1() 的 value 會去將外尋找外部的 var value = 1;
我們再來看一個例子:
下面這段程式碼為例,執行sayHi時,因為sayHi函式內沒有person變數,因此向外尋找,找到全域的person '老媽',
這就是範圍鍊的概念
var person = '老媽';
function sayHi() {
console.log('hi' + person);
}
function doMorningWork() {
var person = '老爸';
function meetAuntie() {
var person = '漂亮阿姨';
console.log('哈囉~' + person);
}
}
sayHi();
將程式碼稍做修改,在doMorningWork裡面呼叫sayHi , console.log 結果竟然會跟前一個例子一樣: hi 老媽
這是因為sayHi函式的範圍鍊依然指向全域,雖然他在doMorningWork執行環境下
var person = '老媽';
function sayHi() {
console.log('hi' + person);
}
function doMorningWork() {
var person = '老爸';
function meetAuntie() {
var person = '漂亮阿姨';
console.log('哈囉~' + person);
}
sayHi();
}
doMorningWork();