因為 ECMAScript 支援 First-class Function,因此可在 Function 內定義其他 Function,當 Function 內找不到 Variable 時,會先在 Function 內尋找,若找不到則往 Function 外層尋找,最後才會到 Global 尋找,此稱為 Scope Chain。
Version
ECMAScript 2020
let b = () => console.log(foo)
let a = () => {
let foo = 2
b()
}
let foo = 1
a()
b() 為定義在 global 的 free function,要印出 foo 時找不到 foo,只好往 b() 外層尋找,找到在 global 定義的 foo = 1 印出。

let a = () => {
let b = () => console.log(foo)
let foo = 2
b()
}
let foo = 1
a()
b() 定義在 a() 內,因此列印 foo() 先在 a() 內尋找到 foo = 2 印出。

let a = () => {
let b = () => console.log(foo)
b()
}
let foo = 1
a()
b() 定義在 a() 內,因此列印 foo() 先在 a() 內尋找,但找不到任何 foo,因此只好在往外層尋找,找到 global 的 foo = 1 印出。

Conclusion
- 若為定義在 global 的 function,若 function 找不到 variable,則直接往 global 尋找
- 若為定義在 function 內的 function,若 function 找不到 variable,則會往 function 外層尋找,也就是定義 function 那一層,最後才會往 global 尋找