当前位置: 首页 > 面试题库 >

JavaScript``let''的说明和for循环的块作用域

束建章
2023-03-14
问题内容

我知道这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 times
for (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的语法糖吗?这如何运作?

我了解和之间的区别varlet并在上面进行了说明。我特别想了解为什么不同的声明使用for循环会导致不同的输出。


问题答案:

这只是ES6的语法糖吗?

不,它不仅仅是语法糖。详细资料埋在§13.6.3.9中 CreatePerIterationEnvironment

这如何运作?

如果letfor语句中使用该关键字,它将检查其绑定的名称,然后

  • 使用以下名称创建一个新的词法环境:a)初始化程序表达式b)每次迭代(以前是评估增量表达式)
  • 将具有这些名称的所有变量的值从一个复制到下一个环境

您的循环语句for (var i = 0; i < 10; i++) process.nextTick(_ =>console.log(i));简化为一个简单的

// omitting braces when they don't introduce a block
var i;
i = 0;
if (i < 10)
    process.nextTick(_ => console.log(i))
    i++;
    if (i < 10)
        process.nextTick(_ => console.log(i))
        i++;
        …

while for (let i = 0; i < 10; i++) process.nextTick(_ => console.log(i));
does “desugar” to the much more complicated

// 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++;
          …


 类似资料:
  • 问题内容: ECMAScript 6应该提供块范围,而不会引起麻烦。有人可以解释为什么在函数下面的代码中解析为循环中的最后一个值(与一样),而不是当前迭代中的值吗? 根据MDN在这样的循环中使用应将变量绑定在循环主体的范围内。当我在块中使用临时变量时,事情按我期望的那样工作。为什么有必要? 我使用Traceur和来测试了脚本。 问题答案: quin着眼睛的答案不再是最新的。在ECMA 6规范中,指

  • 本文向大家介绍jQuery中的for循环var与let的区别,包括了jQuery中的for循环var与let的区别的使用技巧和注意事项,需要的朋友参考一下 今天在写jQuery请求接口中发现一个问题:       在用AJAX发送请求中又嵌套了一个AJAX请求,发现在内层请求的success中对第一次success中的循环变量 i 无法获取,具体代码如下:   在第二次的ajax请求后的回调函数中

  • 问题内容: 我不是在问Python的作用域规则。我大致了解作用域在Python中用于循环的原理。我的问题是为什么设计决策是以这种方式做出的。例如(无双关语): 上面将打印(9,2)。 这让我感到很奇怪:“ foo”实际上只是在控制循环,而“ bar”是在循环内部定义的。我能理解为什么可能需要在循环外部访问“ bar”(否则,for循环的功能将非常有限)。我不明白的是为什么循环退出后,控制变量必须保

  • 问题内容: 我在Javascript中遇到了奇怪的行为。我懂了 “对象不支持此属性或方法” 以下代码中的函数异常: 当我使用以下代码更改代码时,问题消失了: inside的值是多少? 问题答案: 不要用于数组迭代。 重要的是要了解,用于访问索引的Javascript数组的方括号语法()实际上是从… 继承的。 该结构不能像其他语言(php,python等)中所看到的那样更传统。 Javascript

  • 这是我的for循环。。。jGRASP说在我的for循环中出现了一个问题,我看不出这个问题,希望能得到一些帮助来修复我的代码。。。 公共类DirectoryLookup{public static void main(String[]args)引发IOException{

  • 我们经常需要重复执行一些操作。 例如,我们需要将列表中的商品逐个输出,或者运行相同的代码将数字 1 到 10 逐个输出。 循环 是一种重复运行同一代码的方法。 “while” 循环 while 循环的语法如下: while (condition) { // 代码 // 所谓的“循环体” } 当 condition 为真时,执行循环体的 code。 例如,以下将循环输出当 i < 3 时的