2017-08-10 76 views
3

据我所知,'let'用于声明块变量。但它不能用相同的名称声明两次。例如:如何理解'for'语句中的'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 

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

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

+0

我不认为是重复的。我想知道两个原则之间的冲突。 – JamesYin

+0

您可以尝试在[通天REPL(https://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-0&targets=&browsers=&builtIns=false&debug=false&code_lz=GYewTgFANgpgLgAgJYILwIAwG5kIDwIDMOSA1KQJQDeAsAFAKMIDO8AKkgLYwgCucEYLwB2AYzhIQwiNXpN5CUVOYhYAOiggA5hCQUscpgF999I0A运行代码)了解它是如何工作的。 –

回答

0

let作用域的变量,它在。 你分配到一个a范围后的块,你不能覆盖它。所以第二次使用let时,它无法处理。

正确用法是:

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

这个问题不是关于第一个代码块,而是它在for循环中的工作方式。 – Ivar

+1

第一个代码是OP,声明他明白'let'是如何工作的。他在'for'循环中要求'let'。 – yuriy636

1

在for循环中,我在它的唯一的开始,在每次迭代中改变它的值声明。

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

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

+1

不正确。正如[本答案](https://stackoverflow.com/questions/16473350/let-keyword-in-the-for-loop)中所解释的,每次迭代'i'都会得到一个新的绑定。 – Ivar

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上分开..所以它在运行时打印值。所以它不会覆盖它...

0

让利允许一次创建变量,但变量的值是可以改变的,例如 -

 let t =5// 
    let t = 6 // throws an errow but 
    t =7 
console.log(t) - gives 7 
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的引用,其值为4 for循环中的新变量。

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

+1

@Ivar你的权利,会马上改变它 – Wernerson

0

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

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

考虑,直到条件失败的代码被一次又一次的重复。

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