JavaScript变量在循环外部还是内部声明?

JavaScript变量在循环外部还是内部声明?,javascript,performance,Javascript,Performance,在AS3中,我认为应该初始化循环外部的所有变量,以提高性能。JavaScript也是这样吗?哪个更好/更快/最佳实践 var value = 0; for (var i = 0; i < 100; i++) { value = somearray[i]; } var值=0; 对于(变量i=0;i

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

var value = 0;

for (var i = 0; i < 100; i++)
{
    value = somearray[i];
}
var值=0;
对于(变量i=0;i<100;i++)
{
value=somearray[i];
}

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

理论上,它在JavaScript中不会有任何区别,因为该语言没有块作用域,只有函数作用域

我不确定performance参数,但仍然建议将
var
语句作为函数体中的第一个语句。引述自:

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

我认为他有道理,正如你在下面的例子中所看到的。在函数顶部声明变量不应使读者误以为变量
i
位于
for
循环块的
范围内:

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

  for (i = 0; i < 10; i++) {
    // ...
  }
}
函数myFunction(){
var i;//变量的范围非常清楚
对于(i=0;i<10;i++){
// ...
}
}

好吧,这取决于你想要实现什么。。。如果
value
假设它只是循环块中的一个临时变量,那么使用第二种形式就更清楚了。它也更具逻辑性和详细性。

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


此外,除非必须,否则永远不要优化性能。将变量放在第一次需要它们的地方可以保持代码整洁。消极的一面是,习惯使用具有块作用域的语言的人可能会感到困惑。

ECMA-/Javascript
language
会将任何声明在函数顶部的变量提升。这是因为该语言与许多其他类似C语言一样,具有
功能范围
,而不具有
块范围

这也称为
词法范围

如果你申报的是

var foo = function(){
    for(var i = 0; i < 10; i++){
    }
};
因此,这对性能没有任何影响(如果我在这里完全错了,请纠正我)。

not在函数顶部以外的地方声明变量的一个更好的参数是可读性。在
for循环
中声明变量可能会导致错误的假设,即该变量只能在循环体中访问,这是完全错误的。事实上,您可以在当前范围内的任何地方访问该变量。

在JavaScript或ActionScript中,在含义或性能上绝对没有差异

var
是解析器的指令,而不是在运行时执行的命令。如果某个特定标识符在函数体(*)中的任何位置声明了一次或多次
var
,则该标识符在块中的所有使用都将引用局部变量。将
value
声明为
var
在循环内、循环外或两者都声明没有区别

因此,你应该写你认为最可读的东西。我不同意Crockford的观点,将所有变量放在函数的顶部总是最好的。对于在代码段中临时使用变量的情况,最好在该段中声明
var
,以便该段独立并可以复制粘贴。否则,在重构期间将几行代码复制粘贴到一个新函数中,而无需单独挑选和移动关联的
var
,您就得到了一个意外的全局变量

特别是:

for (var i; i<100; i++)
    do something;

for (var i; i<100; i++)
    do something else;

for(var i;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());
var计数=100000000;
var a=0;
console.log(新日期());

对于(var i=0;i javascript是C或C++底部写的一种语言,我不太确定是哪一种,它的目的之一是节省处理内部内存的浪费。
即使在C或C++中,当变量在一个循环内声明时,你也不必担心它是否会消耗大量资源。为什么你应该在JavaScript中担心它?

< P>这里的问题是在循环中声明一个var。
var a = 30;
var a = 50;
var a = 60;

你认为这是对的吗?不……因为你不想多次声明一个变量。当你在循环中声明一个变量时,它不会声明循环运行的次数吗?显然,当你处于“使用严格”模式时,它会打你一巴掌。人们在没有考虑原始问题的情况下不同意Crockford


因此,在顶部声明变量总是很好的——1.为了可读性,2.养成良好的习惯。

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

for (let i = 0; i < 100; i++) {
    let value = somearray[i];
    //do something with `value`
}
for(设i=0;i<100;i++){
设value=somearray[i];
//做有价值的事`
}

在Linux操作系统上对Chrome、Firefox和jsperf运行测试后,在循环内变量声明和循环外变量声明之间似乎存在性能差异。这是一个很小的差异,但迭代量和变量声明量也会使这一差异更加复杂

因此,为了获得最佳性能,我会
var a = 30;
var a = 50;
var a = 60;
for (let i = 0; i < 100; i++) {
    let value = somearray[i];
    //do something with `value`
}
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
for (let i = 0, sum = 0; i < count; i++) { // count also be declared here like count = array.length;
  sum = sum + 1;
}