在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];
}
当前回答
我只是在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的第一个情况。这个测试似乎和第二个测试一样快,在第二个测试中,我预先声明了索引。
其他回答
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
我更喜欢将可读性和性能结合起来。 所以我最喜欢在循环中声明变量,这意味着我将有块作用域封装。
for (let i = 0, sum = 0; i < count; i++) { // count also be declared here like count = array.length;
sum = sum + 1;
}
根据之前提供的小提琴性能测试,获胜者是4号
这里的问题基本上是在循环中声明一个变量。想想如果你这样做会发生什么:
var a = 30;
var a = 50;
var a = 60;
你认为这样对吗?不…因为你不想多次声明一个变量。当你在循环中声明一个变量时,它不是声明了循环运行的次数吗?显然,当你处于“严格使用”模式时,它会扇你耳光。人们不考虑最初的问题就不同意Crockford的观点。
所以在上面声明变量总是好的- 1。为了可读性,2。养成好习惯。
理论上讲,这对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++) {
// ...
}
}