如何在'for'语句中理解'let'?

时间:2017-08-10 09:39:31

标签: javascript scope ecmascript-5

据我所知,'let'用于声明块变量。但它不能用同名声明两次。例如:

'use strict';
let a = 1;
let a = 2; // syntax error

那么如何使用相同的变量名将'for'迭代中的每个范围分开?

'use strict';
for(let i = 0; i < 3; i++){
    setTimeout(function(){
        console.log(i);
    });
}
// output: 
// 0
// 1
// 2

剂量解释器默默地更改变量名称?任何信息将不胜感激。

我认为这不是一个重复的问题。因为我真的想问的是两种理论之间的冲突。

6 个答案:

答案 0 :(得分:1)

在for循环中,i仅在开始时声明,并且在每次迭代中它都会更改它的值。

let用于变量,你将再次写入值。

在第一个示例中,您定义了名为“a”的变量,因此您无法定义具有相同名称的另一个变量,但您可以更改它在for循环中发生的值。

答案 1 :(得分:0)

let将您的变量范围限定在它所在的块中。 将范围指定给a后,您无法覆盖它。所以第二次使用let时,它无法处理。

正确使用将是:

'use strict';
let a = 1;
a = 2;

答案 2 :(得分:0)

'use strict';
let a = 1;
let a = 2; // syntax error

'use strict';
let a = 1;
var a = 2; this will overwrite...

这里你已经指定了一个值..你的意图是,它不应该在运行时改变。所以你不能在块中声明相同类型let ..

后更改它

为什么会出现此错误..

let的意图是价值不应该改变..

循环中的

它将在iterate上分开..所以它在运行时打印值。所以它不会覆盖它......

答案 3 :(得分:0)

在第一个示例中,变量a在同一范围内定义了两次。这会给您一个错误,因为该变量已经存在。 let不允许这样做,使用var重新声明。这是使用let的一个优点。

var a = 3;
var a = 2;

console.log(a); // 2

let b = 3;
let b = 2; //syntax error

let c = 3;
var c = 2; //also a syntax error

在for循环中,i变量具有不同的范围。这两个i变量的含义不是相同。

let i = "my string";
console.log(i); //my string

for(let i = 1; i <= 3; ++i){
  console.log(i); //1, 2, 3
  
}

console.log(i); //my string

javascript运行时不关心您的变量是否相同。它将区分范围,从而区分变量。它正在将对i的引用替换为for循环中的新变量,其值为4。

我在Stackoverflow上的here上有一个答案,它描述了Android编译器如何不关心你的变量名。它在这里是相同的,运行时使用不同的“名称”(不同的内存地址)。

答案 4 :(得分:0)

在循环中,变量不会再次声明,只会增加其值。 它类似于以下内容:

'use strict';
 let i = 0;
 i = i + 1;

考虑一遍又一遍地迭代代码,直到条件失败。

答案 5 :(得分:0)

for(let i = 0; i < 3; i++){ // code }

步骤:

  1. let i = 0

  2. 结帐i<3

  3. exec code

  4. i++,等于i = i + 1 //不会发生错误,而let i = i + 1会发生异常

  5. 循环步骤-2直到i<3 == false