用for循环解释‘let’和块范围我明白let防止重复声明,这是很好的。let x;let x; // error!声明变量let也可以在闭包中使用,这是可以预期的。let i = 100;setTimeout(function () { console.log(i) }, i); // '100' after 100 ms我有点难以把握的是let适用于循环。这似乎是特定于for循环。考虑一下经典的问题:// prints '10' 10 timesfor (var i = 0; i < 10; i++) { process.nextTick(_ => console.log(i)) }
// prints '0' through '9'for (let i = 0; i < 10; i++) { process.nextTick(_ => console.log(i)) }为什么使用let在这方面起作用了吗?在我的想象中,即使只有一个街区是可见的,for实际上为每个迭代创建一个单独的块,并且let声明是在那个块内完成的.。但只有一个let声明来初始化值。这只是ES6的语法糖吗?这是怎么回事?我明白var和let并在上面作了说明。我特别感兴趣的是,为什么不同的声明使用for循环。
3 回答
慕斯709654
TA贡献1840条经验 获得超5个赞
这只是ES6的语法糖吗?
CreatePerIterationEnvironment
.
这是怎么回事?
let
for
为a)初始化表达式b)每次迭代(以前用于计算增量表达式)创建一个具有这些名称的新的词法环境 将具有这些名称的所有变量的值从一个复制到下一个环境。
for (var i = 0; i < 10; i++) process.nextTick(_ => console.log(i));
// omitting braces when they don't introduce a blockvar i;i = 0;if (i < 10) process.nextTick(_ => console.log(i)) i++; if (i < 10) process.nextTick(_ => console.log(i)) i++; …
for (let i = 0; i < 10; i++) process.nextTick(_ => console.log(i));
// using braces to explicitly denote block scopes,// using indentation for control flow{ let i; i = 0; __status = {i};}{ let {i} = __status; if (i < 10) process.nextTick(_ => console.log(i)) __status = {i};} { let {i} = __status; i++; if (i < 10) process.nextTick(_ => console.log(i)) __status = {i}; } { let {i} = __status; i++; …
陪伴而非守候
TA贡献1757条经验 获得超8个赞
var-在for循环的头上声明一个变量将为该变量创建单个绑定(存储空间): const arr = [];for (var i=0; i < 3; i++) { arr.push(() => i);}arr.map(x => x()); // [3,3,3]
三个箭头函数体中的每个I都引用相同的绑定,这就是它们都返回相同值的原因。
如果让-声明一个变量,则为每个循环迭代创建一个新的绑定: const arr = [];for (let i=0; i < 3; i++) { arr.push(() => i);}arr.map(x => x()); // [0,1,2]
这一次,每个我都提到一个特定迭代的绑定,并保留当时的值。因此,每个箭头函数返回不同的值。
添加回答
举报
0/150
提交
取消