2016-07-28 175 views
6

在哪裏以及如何聲明循環中使用的新變量?ES6在循環之前或循環中聲明變量

答:

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('|'); 
    //... 
} 

大概是A或B,因爲大家都說咱們是新的變種,但有什麼區別A和B?

編輯:
變量cols將僅用於內部for。我想知道是否有一些問題,如果變量在循環內初始化(例如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

「*大家都說let是新的var *」 - 用一支沒有任何資格的棍棒擊敗每個人。 – Bergi

+0

「*防止循環內的100個初始化變量cols *」 - 這是編譯器的工作。你不需要也不應該這樣做。 – Bergi

回答

3

在代碼段A,colsfor太以外訪問。由於let變量是塊範圍的,因此當使用let來定義for中的變量時,該變量的範圍僅適用於該塊。因此,在B中,變量cols將不能在for之外訪問。

C,與A相似,如果cols僅定義一次。如果col在同一範圍內定義兩次,使用let將導致錯誤。

要使用哪一個取決於用例。

  1. 如果需要內部forcols只,然後使用let cols = ...
  2. 如果需要的forcols太,for之前使用let cols;,然後它可以for後也以相同的封閉範圍內使用。請注意,在這種情況下,cols將是循環中分配的最後一個值。
+0

在代碼片段B和C中 - 當變量使用let在循環中聲明時 - 是爲循環的每次遍歷聲明還是僅聲明一次?這可能是一個性能問題。 –

0

A和B之間的差值是變種的範圍。在第一種情況下,您也可以在循環外訪問cols,而在第二種情況下則不能。

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