constlet で定義された変数は window 上のプロパティとならなくなり、let による再宣言は例外が投げられます

公開日: | カテゴリー: JavaScript

概要

ECMAScript 2015 (ES6) 準拠の一環として、constlet 命令文の挙動が仕様に合わせて変更されました。

従来これらの命令文で定義されたグローバル変数は、var で定義されたグローバル変数と同様に、グローバルオブジェクト (window もしくはグローバルスコープ内の this) 上のプロパティとしてアクセス可能でした。これは今後動作しなくなるため、let x = 1; alert(window.x);const y = 1; alert(window.y); はいずれも undefined となります。一方 var z = 1; alert(window.z); では引き続き 1 が出力されます。この問題の最も簡単な回避策は、constlet の代わりに var を使うことです。

同時に、let によるグローバル変数の再宣言も禁止され、以下のコードサンプルは動作しなくなります。

<script>
  let a = 1;
  let a = 2; // TypeError が投げられます
</script>
<script>
  let a = 1;
</script>
<script>
  let a = 2; // TypeError が投げられます
</script>
<script src="other.js"></script>
<script>
  let a = 2; // a が other.js 内で定義されている場合 TypeError が投げられます
</script>

また、eval メソッドで評価されたコードは、let あるいは const で定義されたグローバル変数を外部コンテキストへ伝播しなくなり、従って以下のコードも動作しません。

<script>
  eval('let a = 1;');
  alert(a); // ReferenceError が投げられます
</script>

なお、let 命令文は 明示的な JavaScript バージョンを必要としなくなりました

更新: Firefox 46 以降、変数の再宣言は、仕様に従って TypeError ではなく SyntaxError を投げるようになりました

参考資料