为了账号安全,请及时绑定邮箱和手机立即绑定

用for循环解释‘let’和块范围

用for循环解释‘let’和块范围

青春有我 2019-06-25 15:16:17
用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的语法糖吗?

不,这不仅仅是语法糖。血淋淋的细节被埋葬在第13.6.3.9节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++;
          …


查看完整回答
反对 回复 2019-06-25
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

我发现这是从探索ES6书中得到的解释。最好的:

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]

这一次,每个我都提到一个特定迭代的绑定,并保留当时的值。因此,每个箭头函数返回不同的值。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 586 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信