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进行的所有调用。