JS函数循环中的循环迭代器问题

时间:2011-09-15 20:32:48

标签: javascript

这是我的代码:

function func(){
 for(i=0; i < 5; i++){
   alert('B');
 }
}

for(i=0; i < 5; i++){
  func();
  alert('A');
}

我的预期是:BBBBBABBBBBABBBBBABBBBBABBBBBA

但收到的只是BBBBBA

我发现那是因为JS中存在函数范围,而不是块范围。我想知道的是如何保持这种行为。我的意思是强制阻止范围。否则很容易制造出令人讨厌的错误 - 例如使用其他人写的功能或你自己编写的功能,但几个月前。

6 个答案:

答案 0 :(得分:5)

请务必使用var i=0而不是i=0。否则,它会浮动到全局范围,并被两个循环使用。

function func(){
    for(var i=0; i < 5; i++){
       alert('B');
    }
}

for(var i=0; i < 5; i++){
    func();
    alert('A');
}

答案 1 :(得分:3)

问题在于i是全局变量。用户var将其范围限制为func函数:

function func(){
  for(var i=0; i < 5; i++){
    alert('B');
  }
}

使用声明方式的变量的函数不会污染全局命名空间。

答案 2 :(得分:2)

在函数func

中将变量i设置为局部范围
function func(){
 for(var i=0; i < 5; i++){
   alert('B');
 }
}

答案 3 :(得分:2)

不要使用全局变量(正如您所注意到的那样,可能会被所有代码意外更改。这与词法作用域无关,在C中也会发生类似代码)。而是将每个变量设为本地:

function func(){
 for(var i=0; i < 5; i++){ // var
   alert('B');
 }
}

for(var i=0; i < 5; i++){ // var
  func();
  alert('A');
}

答案 4 :(得分:2)

function func(){
 for(var i=0; i < 5; i++){
   console.log('B');
 }
}

for(var i=0; i < 5; i++){
  func();
  console.log('A');
}

这应该对你有用

http://jsfiddle.net/jvXHM/

答案 5 :(得分:1)

使用vari设为本地:

function func(){
 for(var i=0; i < 5; i++){
   alert('B');
 }
}

for(i=0; i < 5; i++){
  func();
  alert('A');
}