2016-07-28 121 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