【问题标题】:Optimization - For statement and variable declarations优化 - 对于语句和变量声明
【发布时间】:2015-08-17 17:14:46
【问题描述】:

这是from MDN关于'for'语句的引用:

表达式(包括赋值表达式)或变量 宣言。通常用于初始化计数器变量。这 expression 可以选择使用 var 关键字声明新变量。 这些变量不是循环的本地变量,即它们在同一个 for 循环所在的范围。该表达式的结果被丢弃。

所以当我写这种代码时:

for(var i = 0; i < 10; i++) {
    for(var j = 0; j < 10; j++) {
        // ...
    }
}

在外循环的每次迭代中,我都声明了变量 j,它已经声明对了吗?

那么写这样的东西会更好吗:

for(var i = 0, j = 0; i < 10; i++) {
    for(j = 0; j < 10; j++) {
        // ...
    }
}

...还是我们不在乎?

【问题讨论】:

  • 只要在同一个函数作用域内声明,没关系。如果你在 for 循环中声明它,它有助于表明你打算只在 for 循环中使用它。所以我会选择选项 1。

标签: javascript loops scope


【解决方案1】:

这句话所指的行为称为提升,在 JavaScript 中很重要。

这是the MDN explains it

因为变量声明(以及一般的声明)是 在执行任何代码之前处理,在任何地方声明一个变量 在代码中相当于在顶部声明它。这也意味着 一个变量在它被声明之前可以被使用。这 行为被称为“提升”,因为看起来变量 声明被移到函数或全局代码的顶部。

之所以没有在函数顶部声明所有变量,是因为它们的本地化使代码更清晰。

在第一个循环中声明两个变量绝对没有任何好处。这只是令人困惑。 JS 引擎也是如此,但其他阅读此代码的开发人员会想知道为什么 j 会在意外位置声明。

现在,如果您对变量之前存在(带有 undefined 值)和使用它的循环之后存在的事实感到不安,请高兴:ES6 附带了一个新的声明类型:let,它将变量范围限定为块。

for(let i = 0; i < 10; i++) {
    for(let j = 0; j < 10; j++) {
        // ...
    }
}

Beware: compatibility of let

现在,请使用大家期望的标准格式:

for(var i = 0; i < 10; i++) {
    for(var j = 0; j < 10; j++) {
        // ...
    }
}

约定,在这种情况下,ij 不会在外部使用 他们的循环。当(并且仅在这种情况下)您想在之后使用 ij 时(例如循环中有一个中断),请使用:

var i, j;
for(i = 0; i < 10; i++) {
    for(j = 0; j < 10; j++) {
        // ...
    }
}
// use i and j here

【讨论】:

  • 如果有两个连续的而不是嵌套的循环呢?在这些情况下,我通常在函数的开头声明一次 i 变量
  • @Pablo 我个人强烈喜欢重复var 语句,即使没用:它更清晰,并且可以防止在有人重构和移动第一个循环时出现错误。但请注意,在这种情况下,有些 linter 会混淆。
  • 我正在这样做,但我开始使用 JSHint,它抱怨到处都有重复的声明......不过我每次都重置变量以避免那个错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多