优化 - 用于语句和变量声明

时间:2015-06-03 13:07:44

标签: javascript loops scope

以下是关于'for'语句的引用from MDN

  

表达式(包括赋值表达式)或变量   宣言。通常用于初始化计数器变量。这个   表达式可以选择使用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++) {
        // ...
    }
}

......或者我们不在乎?

1 个答案:

答案 0 :(得分:5)

此引号引用的行为称为提升,在JavaScript中很重要。

以下是the MDN explains it

的方式
  

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

您没有在函数顶部声明所有变量的原因是因为他们的本地化使代码更清晰。

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

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

let

Beware: compatibility of let

目前,请使用每个人都期望的标准表格:

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

在这种情况下,惯例for(var i = 0; i < 10; i++) { for(var j = 0; j < 10; j++) { // ... } } i不会在 他们的循环。当(并且仅在这种情况下)你想在之后使用ji时(例如循环中断),请使用:

j