在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`
}
其他回答
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++) {
// ...
}
}
我更喜欢将可读性和性能结合起来。 所以我最喜欢在循环中声明变量,这意味着我将有块作用域封装。
for (let i = 0, sum = 0; i < count; i++) { // count also be declared here like count = array.length;
sum = sum + 1;
}
根据之前提供的小提琴性能测试,获胜者是4号
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循环中声明变量可能会导致错误的假设,即该变量只能在循环体中访问,这是完全错误的。事实上,您可以在当前作用域中的任何地方访问该变量。