考慮此ES2015模塊以及在節點v4.4.5中運行時的行爲。ES2015中的開關語句和範圍
'use strict'
const outer = 1
switch ('foo') {
case 'bar':
const heyBar = 'HEY_BAR'
break
case 'baz':
const heyBaz = 'HEY_BAZ'
break
default:
const heyDefault = 'HEY_DEFAULT'
}
console.log(
outer, // 1, makes sense, same top-level scope
heyBar, // undefined. huh? I thought switch did NOT create a child scope
heyBaz, // undefined. huh? I thought switch did NOT create a child scope
heyDefault) // 'HEY_DEFAULT' makes sense
這似乎在內部與我不一致。如果switch語句沒有創建詞法範圍,我希望所有的變量都是主範圍的一部分,並且所有的行爲都是一致的。如果switch語句確實創建了一個詞法作用域,我仍然認爲它們是一致的,但case
子句中聲明的變量的行爲與它們在子作用域中的行爲類似,而default
子句中的變量的行爲與它在外部範圍。
我的問題是 switch語句中是否包含任何子範圍,如果有的話,它們的行爲細節是什麼?
在節點v6.4.0中,行爲是不同的。它看起來像開關塊確實創建一個子塊範圍。
ReferenceError: heyBar is not defined
而且這似乎更直接瞭解。
順便說一句,如果你爲每個案例添加一個塊範圍,你可以創建一個每個案例範圍:'case'bar':{const heyBar ='HEY_BAR';打破}'。 – ftor