全部変数を宣言するキーワードという共通点がるが、let
とconst
は ES2015(ES6)から登場し、色んな特徴を持つ。
var
は関数スコープ。let
とconst
はブロックスコープ。
function run() {
var foo = 'Foo'
let bar = 'Bar'
console.log(foo, bar)
{
let baz = 'Bazz'
console.log(baz)
}
console.log(baz) // ReferenceError
}
run()
var
は 関数スコープの最上段に Hoisting され、宣言の時undefined
となる。let
とconst
はブロックスコープの最上段に Hoisting され 宣言だけされ、値が与えられる前にはなんの値を持たない。
function run() {
console.log(foo) // undefined
var foo = 'Foo'
console.log(foo) // Foo
}
run()
function checkHoisting() {
console.log(foo) // ReferenceError
let foo = 'Foo'
console.log(foo) // Foo
}
checkHoisting()
let
の場合宣言前に Hoisting されるが、どんな値ももたないため ReferenceError が発生する。これを**TDZ(Temporal Dead Zone)**という。
strict mode 以外
var
は global scope で宣言された時 global object に Binding されるが、let
, const
は Binding されない。
var foo = 'Foo' // globally scoped
let bar = 'Bar' // globally scoped
console.log(window.foo) // Foo
console.log(window.bar) // undefined
var
は 再宣言が可。let
とconst
は不可
var foo = 'foo1'
var foo = 'foo2' // 問題ない。
let bar = 'bar1'
let bar = 'bar2' // SyntaxError: Identifier 'bar' has already been declared
- var と let は変更可
- const は宣言と同時に初期化が行われるため、変更が不可。