3

这是我的代码:

    var showNo = 1;     
    window.setInterval(function() {
          console.log(showNo);
          if(showNo === 1) { var nextNo = 2;  }
          else if(showNo === 2) { var nextNo = 3;  }
          else if(showNo === 3) { var nextNo = 4;  }
          else if(showNo === 4) { var nextNo = 5;  }
          else if(showNo === 5) { var nextNo = 1;  }
          else { var showNo = 1; var nextNo = 2; }

          var showNo = nextNo;
          }, 500);

我的问题是,为什么 setInterval 循环开始时 showNo 变量不保持?在上面的示例中,控制台显示“未定义”。这可能是一个简单的问题,但我正在尝试自学查询,这让我陷入了困境。

任何答案都会很棒。

谢谢。

4

5 回答 5

10

您正在重新创建一个名为 的新 LOCAL 变量showNo,这不是引用名为 的 GLOBAL 变量showNo

使用全局变量是非常糟糕的做法,我建议将其包装在匿名函数中

我认为这就是你想要做的:

  (function() {
      var showNo = 1;     
      window.setInterval(function() {
            console.log(showNo);

            if( showNo >== 1 && showNo <== 4 ) {  
                showNo++;
            } else if( showNo === 5 ) {
                showNo = 1;  
            } else { 
                showNo = 2; 
            }

            }, 500);
    })();
于 2010-03-14T04:36:39.013 回答
1

@Jacob 说的是真的,但你可能想看看像这样简化你的代码:

var showNo = 1;     
window.setInterval(function() {
      console.log(showNo);
      showNo++;
      if(showNo > 4)
          showNo = 1;
      }, 500);
于 2010-03-14T04:47:31.053 回答
1

我建议您阅读Javascript Closures,然后您将深入了解 JavaScript 中标识符是如何解析的。

于 2010-03-14T05:28:49.723 回答
1

在 JavaScript 的广阔世界中,var声明是函数范围的,而不是块范围的。它们也被提升到函数的顶部。所以,你不妨写:

var showNo = 1;     
    window.setInterval(function() {
          var showNo; // I'm localizing it
          var showNo; // and again
          var nextNo; // Now I'm declaring a new variable
          var nextNo; // and I just can't stop
          var nextNo; // myself from declaring it again
          var nextNo; // its like beating
          var nextNo; // a
          var nextNo; // dead horse.
          console.log(showNo);
          if(showNo === 1) { nextNo = 2;  }
          else if(showNo === 2) { nextNo = 3;  }
          else if(showNo === 3) { nextNo = 4;  }
          else if(showNo === 4) { nextNo = 5;  }
          else if(showNo === 5) {  nextNo = 1;  }
          else { showNo = 1; nextNo = 2; }

          showNo = nextNo;
          }, 500);

您现在可能会看到问题所在。

其他人对重构的建议也很重要。但是了解 javaScript 中的作用域,这些烦恼就会消失。

于 2010-03-14T07:50:32.710 回答
0

这将保持价值。

function hello(){
    var count = 0;
    var timer = setInterval( function(){  count+=1;alert(count); },2000);
}
于 2012-11-13T08:10:35.097 回答