【问题标题】:Variable scope in javascript when iterating through a stack遍历堆栈时javascript中的变量范围
【发布时间】:2012-12-22 22:34:57
【问题描述】:

我很困惑。有人可以向我解释为什么这会产生无限循环吗?

var constant = 4;
var stack = new Array();
stack.push(0);
stack.push(1);
loop1();


function loop1(){    
    for(i = 0; i < constant; i++){
        loop2(i);
    }
}

function loop2(num){
    for(i = 0; i < stack.length; i++){
        console.log(i); 
    }
}

​ 小提琴:http://jsfiddle.net/elclanrs/tywV9

我怀疑它与 Javascript 函数级变量范围有关,但我的猜测是这样。

【问题讨论】:

  • 我认为你的问题是你没有声明i,在你的循环中尝试var i = 0
  • 我们通常不需要在 JS 中声明变量,对吗?那么在这种情况下我们为什么必须这样做呢?
  • 如果你不这样做,那么i 是全局的,可能会导致问题。
  • @LimH 您应该使用var 关键字声明变量,否则它们会被隐式设为全局变量。出于多种原因,强烈建议限制使用全局变量。
  • 加上全局i的小提琴挂在我的浏览器上,而var却没有jsfiddle.net/elclanrs/UEjaY

标签: javascript scope


【解决方案1】:

当您不使用var 关键字声明变量时,该变量是全局变量,因此loop2loop1 使用相同的(全局)i 变量。每次调用 loop2 时,i 都会设置为 0,然后递增到 stack.length,即 2。这意味着 loop1 的每次迭代都将以 i=2 结束,递增到 3但永远不会达到constant,即 4。

如果您将 for 循环更改为 for (var i = 0; ...) 而不是 for (i = 0; ...),则不应再无限循环。

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 2018-11-24
    • 2020-10-09
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多