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

Cin*_*inn 5 javascript scope loops

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

表达式(包括赋值表达式)或变量声明.通常用于初始化计数器变量.该表达式可以选择使用var关键字声明新变量. 这些变量不是循环的局部变量,即它们与for循环所在的范围相同.此表达式的结果将被丢弃.

所以当我写这种代码时:

for(var i = 0; i < 10; i++) {
    for(var j = 0; j < 10; j++) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在外循环的每次迭代中,我声明变量j,它已经被声明为正确?

所以写这样的东西更好:

for(var i = 0, j = 0; i < 10; i++) {
    for(j = 0; j < 10; j++) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Den*_*ret 5

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

以下是MDN如何解释它:

因为在执行任何代码之前处理变量声明(以及一般的声明),所以在代码中的任何地方声明变量等同于在顶部声明它.这也意味着变量可以在声明之前使用.此行为称为"提升",因为看起来变量声明被移动到函数或全局代码的顶部.

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

绝对没有收获,在带有瓦尔在第一循环被宣布.这只是令人困惑.JS引擎也是如此,但是阅读此代码的其他开发人员会想知道为什么j会在意外的位置声明.

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

for(let i = 0; i < 10; i++) {
    for(let j = 0; j < 10; j++) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:兼容性 let

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

for(var i = 0; i < 10; i++) {
    for(var j = 0; j < 10; j++) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

公约,在这种情况下,是ij不会被他们的循环之外使用.当(并且仅在这种情况下)你想要使用ij之后(例如循环中断)时,使用:

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