在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];
}

当前回答

关于在Linux操作系统上运行Chrome、Firefox和jsperf测试后的性能,循环中的变量声明和循环外的变量声明之间确实存在性能差异。这是一个很小的差异,但这也与迭代的数量和变量声明的数量有关。

因此,为了获得最佳性能,我建议在循环之外声明变量。或者更好的方法是将变量声明成一行。看到的例子。

// inline
for (var ai = 0, al = 100000000, av; ai < al; ai++) {
    av = av + 1;
}

// outside
var bv;
var bl = 100000000;
for (var bi = 0; bi < bl; bi++) {
    bv = bv + 1;
}

注意变量'al'和'av'是如何在for循环声明行中出现的。这种内联声明一直为我提供了更好的性能。甚至在循环之外的变量声明。同样,性能差异非常小。

https://jsperf.com/outside-inline-for-loop-ase/1

其他回答

这里的问题基本上是在循环中声明一个变量。想想如果你这样做会发生什么:

var a = 30;
var a = 50;
var a = 60;

你认为这样对吗?不…因为你不想多次声明一个变量。当你在循环中声明一个变量时,它不是声明了循环运行的次数吗?显然,当你处于“严格使用”模式时,它会扇你耳光。人们不考虑最初的问题就不同意Crockford的观点。

所以在上面声明变量总是好的- 1。为了可读性,2。养成好习惯。

关于在Linux操作系统上运行Chrome、Firefox和jsperf测试后的性能,循环中的变量声明和循环外的变量声明之间确实存在性能差异。这是一个很小的差异,但这也与迭代的数量和变量声明的数量有关。

因此,为了获得最佳性能,我建议在循环之外声明变量。或者更好的方法是将变量声明成一行。看到的例子。

// inline
for (var ai = 0, al = 100000000, av; ai < al; ai++) {
    av = av + 1;
}

// outside
var bv;
var bl = 100000000;
for (var bi = 0; bi < bl; bi++) {
    bv = bv + 1;
}

注意变量'al'和'av'是如何在for循环声明行中出现的。这种内联声明一直为我提供了更好的性能。甚至在循环之外的变量声明。同样,性能差异非常小。

https://jsperf.com/outside-inline-for-loop-ase/1

我只是在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的第一个情况。这个测试似乎和第二个测试一样快,在第二个测试中,我预先声明了索引。

另一个需要考虑的问题是,既然我们在ES2015中有了let和const,现在你可以将变量的作用域专门用于循环块。因此,除非你在循环之外需要相同的变量(或者如果每次迭代都依赖于在前一次迭代中对该变量所做的操作),否则最好这样做:

for (let i = 0; i < 100; i++) {
    let value = somearray[i];
    //do something with `value`
}

在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