範圍鍊:
函式內的變數若有自己的值,就會用自己的。
若是函式內的變數找不到值,就會往外一層函式查找,
直到全域環境有找到或是沒找到 (undefined)。
範圍鍊是依據函式文法本身來決定,與執行環境無關
當 fn2()
內的 a
在自己這層找不到時,就會往上一層 fn1()
找到 a
並使用它的值
fn2()
內的 b
,自己就有宣告 b 值,所以就用自己的
fn2()
內的 c
,自己找不到,往上一層 fn1()
也沒有,最後找到全域的 c
並套用
範例:把上圖的狀況轉換成字長版本
var person = '老媽'
function sayHi() {
console.log('hi ' + person);
}
function doMorningWork() {
var person = '老爸';
function meetAuntie() {
var person = '漂亮阿姨';
console.log('哈囉~ ' + person);
}
meetAuntie();
}
sayHi();
doMorningWork();
當我們執行sayHi()
時,person
會指向全域的老媽,因為sayHi()
本身沒有person
這個變數
執行 doMorningWork()
時,繼續會執行內一層的meetAuntie()
,此時 meetAuntie()
的person
會指向 '漂亮阿姨'
,因為自己本身就有宣告這個變數
同上一個情境,若meetAuntie()
沒有宣告 person
,此時 person
就會指向外面一層的 '老爸'
,再若是沒有找到,最後就會指向全域宣告的 person = '老媽'