所謂的範圍鍊是指當函式本身沒有變數時,而向外層尋找變數的過程,
但尋找的過程和執行環境沒有任何關係,而是跟作用域有關係
範例:
var person = 'mother';
function sayHi() {
console.log(`hi ${person}`);
}
sayHi();
該範例會顯示 'hi mother'
,
因為 sayHi()
函式內沒有 perosn
這個變數,
sayHi
的範圍鍊會指向全域,
所以會將全域的 person
的值代入函式中,
因此才會回傳 'hi mother'
圖解
再看一個範例
let person = 'mother';
function sayHi() {
console.log(`hi ${person}`);
}
function doMorningWork() {
let person = 'father';
function meetAuntie() {
let person = 'weiwei';
console.log(`hello ${person}`);
}
sayHi();
meetAuntie();
}
doMorningWork();
該範例會回傳兩個值分別為 'hi mother'
和 'hello weiwei'
,
首先 doMorningWork()
的 sayHi()
裡的 person
會指向全域,
而 meetAuntie()
因為函式內已經有宣告 person
變數,
所以會使用自己函式內部的變數
圖解
最後一個範例,將 meetAuntie()
內宣告的變數拿掉
let person = 'mother';
function doMorningWork() {
let person = 'father';
function meetAuntie() {
console.log(`hello ${person}`);
}
meetAuntie();
}
doMorningWork();
此時結果為 'hello father'
,
在 meetAuntie()
的範圍鍊會指向 doMorningWork()
,
因為 meetAuntie()
沒有 person
變數,
因此會向外層尋找,而此時的 meetAuntie()
外層為 doMorningWork()
,
所以 person
的值會是 'father'
圖解
此時如果將 doMorningWork()
宣告的 person
拿掉的話
let person = 'mother';
function doMorningWork() {
function meetAuntie() {
console.log(`hello ${person}`);
}
meetAuntie();
}
doMorningWork();
此時 meetAuntie()
的範圍鍊就會指向全域,
因此回傳結果為 'hello mother'
以上就是範圍鍊的內容,明天說明提升(hoisting)