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

var value = 0;

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

or

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

当前回答

嗯,这取决于你想要达到什么目标……如果value只是循环块中的一个临时变量,那么使用第二种形式会更清楚。它也更有逻辑性和啰嗦。

其他回答

JavaScript是一种底层由C或c++编写的语言,我不太确定它是哪一种。它的目的之一是节省处理内部内存的麻烦。 即使在C或c++中,当变量在循环中声明时,您也不必担心是否会消耗大量资源。在JavaScript中为什么要担心这个呢?

在for循环内部或外部声明变量没有区别。 下面是要测试的示例代码。

function a() {
   console.log('Function a() starts');
   console.log(new Date());
    var j;
    for (j=0; j<100000000; j++) {
        var x;
        x = x + 1;
    }
    console.log(new Date());
    console.log('Function a() Ends');
}
a()
function b() {
console.log('Function B() starts');
   console.log(new Date());
    var a;
    var j;
    for (j=0; j<100000000; j++) {
      a = a + 1;
    }
    console.log(new Date());
    console.log('Function B() Ends');
}
b()

结果显示在我的情况下

Function a() starts
VM121:3 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:9 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:10 Function a() Ends
VM121:14 Function B() starts
VM121:15 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:21 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:22 Function B() Ends

谢谢—— MyFavs.in

理论上讲,这对JavaScript没有任何影响,因为该语言没有块作用域,只有函数作用域。

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

JavaScript没有块作用域,所以在块中定义变量会让熟悉其他C语言的程序员感到困惑。定义函数顶部的所有变量。

我认为他是有道理的,你可以从下面的例子中看到。在函数顶部声明变量不应该让读者误以为变量i被保存在for循环块的作用域中:

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

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

嗯,这取决于你想要达到什么目标……如果value只是循环块中的一个临时变量,那么使用第二种形式会更清楚。它也更有逻辑性和啰嗦。

明年,所有浏览器都将拥有预编译代码的JS引擎,因此性能差异(来自于一次又一次解析同一块代码以及执行赋值)应该可以忽略不计。

此外,除非迫不得已,否则永远不要优化性能。将变量放在第一次需要它们的位置附近可以使代码干净。消极的一面是,习惯于使用块作用域的语言的人可能会感到困惑。