在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];
}
在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];
}
当前回答
另一个需要考虑的问题是,既然我们在ES2015中有了let和const,现在你可以将变量的作用域专门用于循环块。因此,除非你在循环之外需要相同的变量(或者如果每次迭代都依赖于在前一次迭代中对该变量所做的操作),否则最好这样做:
for (let i = 0; i < 100; i++) {
let value = somearray[i];
//do something with `value`
}
其他回答
嗯,这取决于你想要达到什么目标……如果value只是循环块中的一个临时变量,那么使用第二种形式会更清楚。它也更有逻辑性和啰嗦。
理论上讲,这对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++) {
// ...
}
}
ECMA-/Javascript语言将任何声明在任何地方的变量提升到函数的顶部。这是因为该语言具有函数作用域,而不像许多其他类c语言那样具有块作用域。 这也被称为词汇范围。
如果你声明
var foo = function(){
for(var i = 0; i < 10; i++){
}
};
这被提升为:
var foo = function(){
var i;
for(i = 0; i < 10; i++){
}
}
所以它对性能没有任何影响(但如果我完全错了,请纠正我)。 除了在函数顶部声明变量之外,不在其他地方声明变量的一个更好的理由是可读性。在for循环中声明变量可能会导致错误的假设,即该变量只能在循环体中访问,这是完全错误的。事实上,您可以在当前作用域中的任何地方访问该变量。
JavaScript是一种底层由C或c++编写的语言,我不太确定它是哪一种。它的目的之一是节省处理内部内存的麻烦。 即使在C或c++中,当变量在循环中声明时,您也不必担心是否会消耗大量资源。在JavaScript中为什么要担心这个呢?
我只是在Chrome上做了一个简单的测试。在浏览器中尝试这一方法并查看结果
var count = 100000000;
var a = 0;
console.log(new Date());
for (var i=0; i<count; i++) {
a = a + 1
}
console.log(new Date());
var j;
for (j=0; j<count; j++) {
a = a + 1;
}
console.log(new Date());
var j;
for (j=0; j<count; j++) {
var x;
x = x + 1;
}
console.log(new Date());
结果是最后一次测试需要~8秒,前两次测试只需~2秒。非常重复,不考虑顺序。
所以,这向我证明了,应该总是在循环之外声明变量。对我来说,奇怪的情况是我在for()语句中声明I的第一个情况。这个测试似乎和第二个测试一样快,在第二个测试中,我预先声明了索引。