JavaScript setInterval循环不包含变量

JavaScript setInterval循环不包含变量,javascript,setinterval,Javascript,Setinterval,这是我的密码: 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;

这是我的密码:

    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变量不保持不变?在上述示例中,控制台显示“未定义”。这可能是一个简单的问题,但我正试图教会自己质疑,这让我陷入困境

任何答案都很好


谢谢

您正在创建一个名为
showNo
的新局部变量,它没有引用名为
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);
    })();
(函数(){
var-showNo=1;
setInterval(函数(){
控制台日志(showNo);

如果@Jacob所说的(showNo>==1&&showNo是真的,但是您可能希望将代码简化一点,如下所示:

var showNo = 1;     
window.setInterval(function() {
      console.log(showNo);
      showNo++;
      if(showNo > 4)
          showNo = 1;
      }, 500);

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

在广泛的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中的作用域,这些烦恼就会消失。

这将保持价值

function hello(){
    var count = 0;
    var timer = setInterval( function(){  count+=1;alert(count); },2000);
}

有什么原因吗?去掉它不会让showNo变量被记住。啊,是的,我现在明白了。所以我必须先创建var,然后继续设置它,而不是每次都重新创建它?这很有效,非常感谢。回答很好!我以后会经常使用这个技巧!根据OP的逻辑,它应该是
2
。是的,我知道了最后使用jquery size()来计算它所需的元素,如果(previewCurrent==previewTotal){previewNext=1;}或者{previewNext=previewCurrent+1;}则使用感谢这不是闭包问题,而是在新范围内重新声明一个变量的问题。@Justin,这有点像是,OP不理解内部变量(在堆栈上)不会停留在函数的下一次迭代中。在其周围添加闭包,将创建一个变量,该变量将持续从setInterval进行的所有调用。