2014-09-10 53 views
1

我们知道,JavaScript有没有BLOCK SCOPE,所以当我写了一个for循环象下面这样:我应该如何申报在JavaScript游标变量?

list = [1, 2, 3, 4]; 
// notice about the `var` keyword 
for(var i = 0; i < list.length; ++i) { 
    // Do something. 
} 
console.log(i); // shows 4 

的事情是:我应该使用var声明变量i


如果这样:

当我有两个或多个连续的循环,我想用同样的游标变量i,将申报不止一次!这只是有问题!

for(var i = 0; i < list1.length; ++i) { 
    // do something. 
} 

for(var i = 0; i < list2.length; ++i) { 
    // do something. 
} 

// `i` was declared more than once! 

在这种形式下,游标变量i也许多次声明,以及代码本身意味着i变量可能对块内的一个范围,但的确不是。


如果不是这样:

我应该明确地宣布所有早些时候函数指针?

var i, j, k; // and maybe a long list that I didn't expected? 

// Maybe some other code. 

for(i = 0; i < count1; ++i) { 
    // do something 
} 

for(j = 0; j < count2; ++j) { 
    // do something 
} 

for(k = 0; k < count3; ++k) { 
    // do something 
} 

如果我这样的代码,我觉得代码是可怕的:它具有声明和使用,以及晦涩的了解自己需要什么声明时间长的距离。

如果我省略了所有的声明,并且只是使用,这些游标变量将落入全局变量!这太可怕了!


所以我要求一个很好的做法,在这种情况下如何声明游标变量?

需要你的帮助。

+0

在_some_ JavaScript中有块范围:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let – 2014-09-10 23:04:31

+1

@MattBall很好,但似乎没有广泛支持,我失败了在chrome调试器中使用它。 – 2014-09-10 23:07:02

+0

这两种方式都是一样的,两种做法都很完善。 – Bergi 2014-09-11 00:40:45

回答

0

声明一个变量它吊到函数的顶部和连续的声明在语法上是合法的,但忽略了。所以:

var i, j, k; // and maybe a long list that I didn't expected? 

// Maybe some other code. 

for(i = 0; i < count1; ++i) { 
// do something 
} 
... 

是解释器在引擎盖下做的事,如果你多次声明它。因此

以这种方式(顶部变量)声明这是人们通常认为什么(什么JSLint的建议)。

3

通常它是最简单的声明变量,则在多个非嵌套循环使用它。

var i; 

for(i = 0; i < list1.length; i++) { 
    // do something. 
} 

for(i = 0; i < list2.length; i++) { 
    // do something. 
} 

在多个循环中重复使用i没有问题。一旦第二个循环开始,该值被设置为初始值,一切都很好。

+1

我不认为'++ i'引起的问题存在,它不是循环条件。 @Alex Wayne – 2014-09-10 23:29:49

+1

在循环的更新部分中使用'++ i'和'i ++'没有区别。表达式的结果并未在条件中使用。 – Bergi 2014-09-11 00:38:40

+0

你说得对,我的坏! – 2014-09-11 16:13:32