优化——语句和变量声明

Optimization - For statement and variable declarations

本文关键字:声明 变量 语句 优化      更新时间:2023-09-26

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

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

…还是我们不在乎?

这个引号所指的行为被称为提升,这在JavaScript中是很重要的。

MDN是这样解释的:

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

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

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

现在,如果您对变量在使用它的循环之前(具有undefined值)和之后存在这一事实感到不安,请高兴:ES6中有一个新的声明类型:let,它将变量作用于块。

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

注意let的兼容性

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

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

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

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