最容易搞錯的 Scope

懶人包。

簡述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var a = 'global scope';
function yoyo () {
var a = 'yoyo scope'
function haha () {
var a = 'haha scope';
mistake()
}
haha()
}
yoyo()
function mistake () {
console.log(a) // global, yoyo, haha ?
}

答案是 global

你很容易會以為是這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var a = 'global scope';
function yoyo () {
var a = 'yoyo scope'
function haha () {
var a = 'haha scope';
// 在這邊呼叫的感覺會讓人以為是這樣
mistake()
function mistake () {
console.log(a) // haha?
}
}
haha()
}
yoyo()

可是不是,我們會說 JS 的作用域是「靜態作用域」,是因為作用域在宣告的時候就已經決定了,所以才說是「靜態的」。

至於上面那個錯誤的示範是「動態作用域」,代表作用域會根據「呼叫」的地方變來變去。

從 ECMAScript 來理解閉包與作用域的原理 檢查一個變數存不存在的正確方式
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×