【问题标题】:What happens to variables declared in loops and the re-used [duplicate]循环中声明的变量和重用的变量会发生什么[重复]
【发布时间】:2015-11-30 13:43:30
【问题描述】:

在 javascript 中,变量只有函数作用域。所以它要么是全局的,要么是在整个函数中可访问的变量,而不管它是在哪里声明的(在函数内)。

我猜最佳做法是在 'use strict'; 之后立即在顶层声明所有变量?

如果我有 5 个循环声明相同的 i var,会发生什么?

for (var i = 0; i < someValue; i+=1) { ... } 

变量是简单地重置为 0 还是循环设置它的初始值并且一切继续?这会引起并发症吗?

【问题讨论】:

  • 变量声明被提升到顶部,因此在顶部声明 var = 0 就可以了,然后在每个循环中 i = 0 只是重新初始化该行上的变量,这样就不会了不会引起并发症,这是否是好的做法是另一个问题。
  • 我建议在控制台上玩一下并自己测试一下。
  • @JoãoGonçalves 到目前为止,我听说的所有 JS 都告诉我,它往往会做很多并不总是立即引人注目的微妙事情。我怕养成坏习惯 JS 比我见过的任何其他语言都多。

标签: javascript variables scope variable-declaration


【解决方案1】:

如您所见,ifor 循环的开头设置为0i = 0var i 部分被提升到函数的顶部,每增加一个var i … 重新声明 ii = 0 部分重新定义它。重新声明是不必要的,并且会使代码不那么干净(JSHint 会警告您)。

如果您稍后在任何循环之外使用i,则i 将设置为for 循环对其所做的任何事情。

for(var i = 0; i < 4; i++){
  /*
  As the last few steps i is incremented (i == 4),
  then it is checked with (i < 4), which is false; the loop is done.
  */
  //…
}
i; // 4

因为您通常会在循环头部重新定义每个迭代变量,所以这不会导致任何其他问题。

但是,对于更简洁的代码,明智的做法是在每个循环中使用一个变量,或者创建 let 变量,而不是 var 变量,因为 let 变量的范围仅限于 for 循环块:

for(let i = 0; i < 20; i++){
  // …
}

for(let i = 0; i < 10; i++){ // This is fine.
  // …
}

let 变量仅在兼容 ECMAScript-6 的浏览器中可用,并且在 Firefox 中需要选择加入的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2018-10-13
    • 2021-08-29
    • 2012-06-03
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多