ES6在循环之前或循环中声明变量

时间:2016-07-28 10:45:25

标签: javascript ecmascript-6

我应该在哪里以及如何声明循环中使用的新变量?

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

可能是A或B因为每个人都说let是新的var,但A和B之间有什么区别吗?

编辑:
变量cols将仅用于内部。如果变量在循环内被初始化(例如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).

2 个答案:

答案 0 :(得分:3)

在代码段A中,function x() { if (this instanceof x) { /* Probably invoked as constructor */ } else return 30; } 也可以在cols之外访问。由于for变量是块范围的,当使用let来定义let内的变量时,变量的范围仅适用于该块。因此,在B中,变量for将无法在cols之外访问。

如果for仅定义一次,则

C类似于A.如果使用cols在同一范围内定义col两次将导致错误。

使用哪一个取决于用例。

  1. 仅在let内需要cols,然后使用for
  2. 如果let cols = ...之外也需要cols,请在for之前使用let cols;,然后在for之后也可以在同一封闭范围内使用for 。请注意,在这种情况下,cols将是循环中分配的最后一个值。

答案 1 :(得分:0)

A和B之间的差异是var的范围。在第一种情况下,你也可以在循环外访问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