一言で言うと、変数のスコープがブロックスコープか関数スコープかの違いです。
let
を使った場合、ブロックレベルで変数のスコープが定義されるため、以下の例のように1,2,1
と表示されます。
function f() {
let x = 1;
console.log(x);
{
let x = 2;
console.log(x);
}
console.log(x);
}
f()
// 1
// 2
// 1
var
は関数でのスコープのため、以下のように1,2,2
と表示されます。
function f() {
var x = 1;
console.log(x);
{
var x = 2;
console.log(x);
}
console.log(x);
}
f()
// 1
// 2
// 2
ES6からはletが使えるため、今後はvar
ではなく好んでlet
が使われるようになるかと思います。
参考
パーフェクトJavaScript |Part2 JavaScript言語仕様 - 6章 関数とクロージャ - 6-4 スコープ - 6-4-3 letとブロックスコープ