【问题标题】:What's the difference between "for(let item of iter)" and ''for(item of iter)" in JavaScriptJavaScript中的“for(let item of iter)”和“for(item of iter)”有什么区别
【发布时间】:2020-03-01 16:43:53
【问题描述】:

我经常使用“for of”语句来遍历一个迭代器,就像下面这样:

for(item of myIterator){
    console.log(item)
}

但是最近发现官方的说法是:

for(let item of myIterator){
    console.log(item)
}

而且它们都执行正确,我想知道它们是否有任何区别。谢谢!

【问题讨论】:

  • 不同之处在于 item 对 JavaScript 是未知的,除非您先声明它,因此第一个示例会创建一个 linter 警告。
  • 这能回答你的问题吗? Is using 'var' to declare variables optional?
  • 如果没有letitem 就变成了一个全局变量(假设你没有在for循环之前用let或者var声明它)

标签: javascript iterator


【解决方案1】:

Let 是一个作用域变量,因此只能在其作用域 {} 内工作。

var myIterator = [0,1,2,3]

//non scoped variables works also out of for-loop, check
for(item of myIterator){
    console.log(item)
}

console.log(item)

上面的例子将打印所有项目,完成后,项目变量仍然是迭代的最后一个项目 现在用 let 作用域变量重试

//scoped variables works only inside for-loop instruction
for(let item2 of myIterator){
    console.log(item2)
}

console.log(item2)

现在 item2 不再可用,因为超出范围并且指令抛出错误。

【讨论】:

    【解决方案2】:

    当您使用尚未声明的变量时,javascript 将在当前函数范围或全局对象范围(又名浏览器中的 windowglobal > 在 node.js 中),这与使用 var 关键字声明变量时的行为相同。

    因此,您的第一个“for of”将创建一个名为 item 的变量,该变量可在 for 范围之外访问。

    let 关键字具有块作用域,因此只能在 for 循环内访问。

    const arr = [1, 2, 3]
    
    for (item of arr) {
        console.log(item)
    }
    
    for (let item2 of arr) {
        console.log(item)
    }
    
    console.log(item)
    console.log(item2)
    

    第二个 console.log 将失败并出现 ReferenceError: item2 is not defined。

    【讨论】:

    • 这说明了问题,我真的不知道一个变量可以在JavaScript中声明之前赋值,我已经写了两年了
    【解决方案3】:

    以这种方式使用let 可以避免在循环中调用函数并将计数器作为参数传递时意外创建闭包。

    【讨论】:

      猜你喜欢
      • 2019-11-28
      • 1970-01-01
      • 2015-05-30
      • 2021-12-19
      相关资源
      最近更新 更多