2016-07-28 16 views
6

ループで新しい変数をどこで宣言すればよいですか?ES6でループの前に変数を宣言する

A:

const map = new Map(Object.entries(columns)); 
let cols; 
for (let [key, value] of map) 
{ 
    cols = value.split('|'); 
    //... 
} 

B:

const map = new Map(Object.entries(columns)); 
for (let [key, value] of map) 
{ 
    let cols = value.split('|'); 
    //... 
} 

C:おそらく

const map = new Map(Object.entries(columns)); 
var cols; 
for (let [key, value] of map) 
{ 
    cols = value.split('|'); 
    //... 
} 

またはBの人はLETが新しいVARであると言いますが、間に違いがありますので、 AとB?

編集:
可変列は内部でのみ使用されます。変数がループ内で初期化されている場合(たとえば100回)に問題があるかどうか疑問に思っていました。だから私はループの外で初期化する必要がありますかと思った。 (A又はBの一例)

The purpose is not to get access outside loop, but prevent (for example) 100 initialization variable cols inside loop (because let is used inside loop - case B).

+0

これは、例Bの場合、常に最も狭い範囲を使用する必要があります。 – ftor

+0

「誰もが新しいvar *です」と言います。 – Bergi

+0

"ループ内の100個の初期化変数の列を防ぐ* *" - これはコンパイラのジョブです。あなたはそれをする必要はありませんし、してはいけません。 – Bergi

答えて

3

colsforのアクセス外です。 letの変数がブロックスコープであるため、を使用してforの内部に変数を定義すると、変数の有効範囲はそのブロックのみになります。したがって、Bでは、変数colsforの外部にはアクセスできません。

Cは、colsが1回のみ定義されている場合、Aに似ています。 colletを使用して同じスコープ内で2回定義されているとエラーになります。

どのケースを使用するかは、使用ケースによって異なります。

  1. colsのみfor内部に必要とされる場合、colsが過度forの外側に必要とされる場合、それは同じ囲み範囲にすぎfor後に使用することができ、次いでforlet cols;を使用して、let cols = ...
  2. を使用します。この場合、colsはループ内で最後に割り当てられた値になります。
+0

スニペットBとC - 変数がループ内でletを使って宣言されたとき - ループの各トラバーサルに対して宣言された変数か、一度だけ宣言された変数ですか?これはパフォーマンス上の問題です。 –

0

はAとBとの間の差は、VARの範囲です。最初のケースでは、colsもループ外にアクセスできます.2番目の場合はできません。コードスニペットAにおいて

let a; 
 

 
for (let i =0; i < 2; i++) { 
 
    let b = i; 
 
    a = i; 
 
} 
 

 
console.log('a outside the loop:', a); 
 
console.log('b outside the loop:', b); 
 
console.log('i outside the loop:', i); //If `var` was used instead of `let` then `i` would have had global scope

関連する問題