2016-04-18 5 views
4

xは定数ではありませんが、次のコードはどのようにエラーなく実行されますか?ループのためにes6でconstを使用する

for (const x of [1,2,3]){ 
console.log(x); 
} 
+0

私はそれが行く方法を行くためにx = x + 1を試してください –

+0

私はそれを実行するとI * do *エラーを取得します: "Constは初期化されなければなりません"。 – nnnnnn

+0

Firefoxの – Oriol

答えて

6

彼らは各反復で新しい、異なる、一定の変数を作成するので、それはクロムのような対応のブラウザで動作します:

var arr = []; 
for (const x of [1,2,3]) 
    arr.push(() => x); 
arr.map(f => f()); // [1,2,3] on Chrome 

一部非対応のブラウザではなく、同じ変数を再利用:

var arr = []; 
for (let x of [1,2,3]) 
    arr.push(() => x); 
arr.map(f => f()); // [3,3,3] on non-compliant browsers 

したがって、上記の例ではconstを使用するとエラーが発生します。


Runtime Semantics: ForIn/OfBodyEvaluationは言う:

  1. Repeat
    1. Else
      1. Assert: lhsKind is lexicalBinding.
      2. Assert: lhs is a ForDeclaration.
      3. Let iterationEnv be NewDeclarativeEnvironment (oldEnv).
      4. Perform BindingInstantiation for lhs passing iterationEnv as the argument.

だから、各反復は、新しいバインディングを作成する必要があります。 Chromeは正しいです。

関連する問題