2017-07-20 3 views
1

私はES6の背後でループがどのように動作するのか興味があります。forループのconst内のES6の内部

これはLET 5つの新しいスコープが作成され、機能がそれらの対応する範囲にバインドされているので、各関数が(0〜4)適切なI値を取得する理由は

var funcs = []; 
for (let i = 0; i < 5; i++) { 
    funcs.push(function() { 
     console.log(i); 
    }); 
}; 

基本的な例です。それは私が思うもので、それは私にとって最も理にかなっています。そうであれば、const宣言(i)が5つの新しいスコープを作成する必要があり、const変数がさまざまなスコープで幸せに生きる必要があるため、なぜそれが失敗するのかは理解できません。 同じ効果を達成するためにIIFEを使用する前に、基本的には関数の新しいスコープを作成し、裏で同じことをやっていると思いました。

上記のステートメントが正しくない場合は、ループ内のループが1つのスコープを作成しているに違いありませんが、var宣言とどのように機能が異なるかがわかりません。さらに明確にするために、letがforループによって作成された1つの新しいスコープにバインドされていて、var宣言がこの場合グローバルスコープに持ち込まれていますが、これもまだ有効なスコープです。

誰でもこのトピックについて少し意見を共有できますか?

+0

'i'を定数として定義すると、' i + = 1'を実行するとコードが失敗します。そうではありませんか? –

+0

よく 'const i'は' i ++ 'がそれを修正しようとするので動作しません – Bergi

+0

@BergiしかしOPにはポイントがあります。全ての 'i'が新しいスコープ内でインクリメントされた値に束縛されているのではありませんか? – ftor

答えて

2

The reason each function will get proper i value (from 0 to 4) is because let is creating 5 new scopes and functions are bound to their corresponding scope.

はい、これは起こります。詳細はExplanation of `let` and block scoping with for loopsを参照してください(実際には6つのスコープがあります)。ここ

If that is the case then it doesnt make sense why const declaration (i) is failing since it should be creating 5 new scopes and const variables can live happily in different scopes.

あなたの誤った仮定はconstletと同じように動作していることです。はい、ループボディ評価で5 constを作成することは可能です。あなたがconstをインクリメントすることはできません - しかし、それはちょうどTypeError: Assignment to constant variableにつながる

for (const i=0; i<5; i++) { 
    console.log(i); 
} 

のようなループのために意味がありません。したがって、forループでは使用しないでください(for…infor…ofループが再度異なることに注意してください)。

OK、1は

let i=0; for (const j=i; i<5; i++) … 

のようなものを書いて、それが動作し、体内の5種類const j変数を取得することが期待できます。しかし、それはどちらかといえども起こることではありません。これはこれを書くのに全く変わった方法です。あなたは、各ループ反復でconst宣言をしたい場合は、より良い明示的にそれを書く:

for (let i=0; i<5; i++) { 
    const j=i; 
    … 
} 

を清潔かつ明確であり、実際には上記の期待しているかもしれないものをしています。 forループ内const宣言は実際に使用されることを意図されている方法

は、この例で示すことができる。

for (const iterator = {…}; iterator.hasNext(); iterator.step()) { 
    … iterator.getValue() … 
} 

我々はthe specを確認した場合、これは実際に

{ 
    const iterator = {…}; 
    for (; iterator.hasNext(); iterator.step()) { 
     … iterator.getValue() … 
    } 
} 

と同じ効果がありますループの先頭に1回だけ宣言されていることを意味します。それはすべての反復でそれを再宣言することは理にかなっていません。

+1

技術的には可能ですが、それは' const'の意味論と矛盾します。それは理にかなっている。ありがとう! – ftor

+0

ありがとうございます。なぜforループで無効にすることにしたのでしょうか。 – Tosheen