JavaScript 变量声明外部循环还是内部循环?

2022-08-30 00:56:46

在AS3中,我认为您应该初始化循环外的所有变量以提高性能。JavaScript也是如此吗?哪个更好/更快/最佳实践?

var value = 0;

for (var i = 0; i < 100; i++)
{
    value = somearray[i];
}

for (var i = 0 ; i < 100; i++)
{
    var value = somearray[i];
}

答案 1

在JavaScript或ActionScript中,在含义或性能上绝对没有区别

var是分析器的指令,而不是在运行时执行的命令。如果某个特定标识符在函数体(*)中的任何位置被声明了一次或多次,那么在块中对该标识符的所有使用都将引用局部变量。无论声明为在循环内部、在循环外部,还是同时声明在循环内部,这一点都没有区别。varvaluevar

因此,你应该写任何你认为最可读的东西。我不同意Crockford的观点,即把所有的var放在函数的顶部总是最好的事情。对于在代码节中临时使用变量的情况,最好在该节中声明,以便该部分独立存在并且可以复制粘贴。否则,在重构期间将几行代码复制粘贴到新函数中,而无需单独挑选和移动关联的代码,这样你就会得到一个意外的全局代码。varvar

特别:

for (var i; i<100; i++)
    do something;

for (var i; i<100; i++)
    do something else;

Crockford会建议你删除第二个(或者删除s和do上面),jslint会为此向你发牢骚。但是IMO将两个代码保持在一起,将所有相关代码保存在一起,而不是在函数顶部有一个额外的,容易被遗忘的代码位,这样更易于维护。varvarvar i;var

就个人而言,我倾向于在独立的代码部分中声明为变量的第一个赋值,无论在同一函数的其他部分中是否存在同一变量名称的另一个单独用法。对我来说,必须声明是一个不受欢迎的JS疣(最好将变量默认为局部);我不认为我有责任在JavaScript中复制ANSI C的[旧版本]的局限性。varvar

(*:嵌套函数体除外)


答案 2

从理论上讲,它不应该在JavaScript中产生任何区别,因为该语言没有块范围,而只有函数范围。

我不确定性能参数,但 Douglas Crockford 仍然建议这些语句应该是函数体中的第一个语句。引用 JavaScript 编程语言的代码约定var

JavaScript没有块范围,因此在块中定义变量可能会让使用其他C族语言的程序员感到困惑。定义函数顶部的所有变量。

我认为他有道理,正如您在以下示例中看到的那样。声明函数顶部的变量不应该让读者误以为变量保存在循环块的范围内:ifor

function myFunction() {
  var i;    // the scope of the variables is very clear

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