JavaScript - varとletの違い、注意点

JavaScriptでは、変数の宣言方法として、「var」命令がありましたが、

ES2015から新たに「let」命令が加わりました。

ここでは、varとletの違いや注意点について説明します。

スコープ(範囲)の違い

varとletの大きな違いはスコープの違いです。

varは関数スコープで、letはブロックスコープです。

次のサンプルコードは、ifブロックの中で変数を宣言しています。

まずはvar命令での宣言の場合です。


if(true){
	var x = 1;
	console.log(x); // 1
}

console.log(x); // 1

varは関数スコープなので、ifブロックの外からでも参照できます。

次は、letを使ってみます。


if(true){
	let x = 1;
	console.log(x); // 1
}

console.log(x); // エラー: Uncaught ReferenceError: x is not defined

letはブロックスコープなので、この場合はifブロックの中でだけ有効になります。

ifブロックの外から参照するとエラーになります。

ifブロックの外でも変数xを使用したい場合は、 下のコードのように、ifブロックの外で変数宣言する必要があります。


let x = 1;	

if(true){
	
	console.log(x); // 1
}

console.log(x); // 1

このように、「letはブロックスコープ」だということを認識していないと 思わぬエラーが発生することがあります。

変数の重複を許可するかどうか

var命令は、変数の重複を許可します。 ですから、次のコードも正常に動作します。

var x = 1;
var x = 2;

console.log(x); // 2

一方、let命令は変数の重複を許可しません。 次のコードはエラーとなります。


let x = 1;
let x = 2; // エラー: Identifier 'x' has already been declared

console.log(x);

通常、同じ名前の変数を宣言することはありません。

間違えて同じ名前を使ってしまうことはあると思います。

その場合は、エラーとして教えてくれるletの方が親切だといえます。

まとめ

・ES2015から変数宣言として新たにlet命令が加わりました。

・var命令は関数スコープ、let命令はブロックスコープです。

・var命令は変数の重複を許可し、let命令は許可しません。