javascript - 在多个循环中,处理声明变量的最惯用方法是什么?

  显示原文与译文双语对照的内容
0 0

Javascript只有函数作用域。 因此,可以看到for循环中声明的变量在整个函数。

例如,

function foo() {
    for(var i = 0; i < n; i++) {
        // Do something
    }
    // i is still in scope here
}

当我们有多个for循环,这将打开的问题我们如何处理这些其他for循环中的变量。

我们使用不同的变量?

for(var i = 0; i < n; i++) { }
for(var j = 0; j < n; j++) { }

还是我们用的是同一个变量而只是赋值( 而不是声明它)?

for(var i = 0; i < n; i++) { }
for(i = 0; i < n; i++) { }

或声明 i外部的循环?

var i;
for(i = 0; i < n; i++) { }
for(i = 0; i < n; i++) { }

或重新声明 i?

for(var i = 0; i < n; i++) { }
for(var i = 0; i < n; i++) { }

所有这些工作( 或者至少他们在我的浏览器的最新版本) 。 JSHint 不喜欢最后的方法,但。

有没有一种方法通常都是惯用或以其他方式更可取?

时间:原作者:9个回答

0 0

它的确取决于你是谁的编码。 如果你正在为公司或编写代码贡献到库你当然按照模板样式指南。 我见过所有这些( 预期最后) 中使用库。 如果你喜欢这Douglas Crockford样式你可以跟倒数第二个,并将所有的变量在函数作用域的顶部( 它也叫做jslint将在认定你) 。

采用中的一个示例 jQuery样式指南

则被视为 Good样式

var i = 0;
if ( condition ) {
    doSomething();
}
while ( !condition ) {
    iterating++;
}
for ( ; i < 100; i++ ) {
    object[ array[ i ] ] = someFn( i );
}

虽然这是可怜的样式

// Bad
if(condition) doSomething();
while(!condition) iterating++;
for(var i=0;i<100;i++) object[array[i]] = someFn(i);

总之,因为这是样式我要引用了几个库自己写for each循环:

如果你的代码将会最小化之后,再释放它作为minifiers将改编到差不多的时候就不会有问题最终表示在处理。

原作者:
0 0

使用不同的变量我们没问题。

重用和重指派可以让代码更易读,如果我们删除声明以后,我们还可能将我分配给函数范围之外的东西。

声明我在循环外,我们没有问题。

重新声明将问题如果lint工具,ide等抱怨。

所以我会坚持认为第一个或第三个选项。 如果变量的数量不能太大使用第一个选项,则你可能需要的是重构。

原作者:
0 0

其他应用来解答问题的在用异样的眼神

函数具有多个环让我可疑,因为:

  1. 它可能做的太多,还是应该被分解,
  2. 则最好是将其写入多个功能和完全消除索引( 它可在某些 each/ mapy 函数无论如何)
原作者:
0 0

另一种方法是使用迭代器函数。 例如,在现代浏览器的 Array将有一个 forEach方法:

var items = ["one", "two", "three"];
var things = ["hello", "goodbye"];
items.forEach(function (item, index) {
   // Do stuff
});
things.forEach(function (item, index) {
   // Do stuff
});

如果你使用的是旧版浏览器( 或自定义集合),可以自己创建迭代器如下所示:

Array.prototype.forEach = function(callback) {       
   for(var i = 0; i < this.length; i++) {
      callback.apply(this, [this[i], i, this]);
   }
};

要更多信息,请查看: Array .prototype .forEach( )

原作者:
0 0

在函数内声明的所有变量都被解释为在函数开头的声明。 doug Crockford争辩说应该声明所有变量在每个函数的第一行。

doSomething = function() {
   var i, ... other variables ...;
   ...
   for (i = 0; i < x; i += 1) {
      ...
   }
   ...
   for (i = 0; i < x; i += 1) {
      ...
   }
}

这样的代码读取要数将由Javascript引擎进行分析。

原作者:
...