iT邦幫忙

2021 iThome 鐵人賽

DAY 5
2
自我挑戰組

JavaScript 核心觀念系列 第 5

【Day05】範圍鍊(Scope Chain)

  • 分享至 

  • xImage
  •  

所謂的範圍鍊是指當函式本身沒有變數時,而向外層尋找變數的過程,

但尋找的過程和執行環境沒有任何關係,而是跟作用域有關係

範例:

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)


上一篇
【Day04】執行環境與執行堆疊
下一篇
【Day06】提升(Hoisting)
系列文
JavaScript 核心觀念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言