2010-03-14 27 views
3

這裏是我的代碼:的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; } 
      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); 

我的問題是,爲什麼是showNo變量未持有的setInterval循環開始的時候?在上面的例子中,控制檯顯示'undefined'。這可能是一個簡單的問題,但我試圖教自己查詢,這讓我卡住了..

任何答案都會很好。

謝謝。

回答

10

您正在重新創建一個名爲showNo的新LOCAL變量,該變量未引用名爲showNo的GLOBAL變量。

這是非常不好的做法,使用全局變量,我建議這個包裹的匿名函數

我覺得這裏面是你希望做什麼:

(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); 
    })(); 
+0

是有原因嗎?拿出它不允許showNo變量被記住.. – Ryan 2010-03-14 04:39:08

+0

啊是的,我現在看到。所以我必須先創建var,然後設置它,而不是每次重新創建它?這工作,非常感謝。 – Ryan 2010-03-14 04:45:38

+0

很好的答案!我將在未來使用這個技巧! – Goahnary 2016-05-04 20:25:23

1

什麼@雅各布說的是真的,但你可能想看看簡化你的代碼有點像這樣:

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

@John,如果'showNo'爲'0'會發生什麼? – 2010-03-14 04:50:18

+0

根據OP的邏輯,它應該是'2'。 – 2010-03-14 04:50:42

+0

是的,我結束了使用jquery size()來計算它需要的元素,並且如果(previewCurrent === previewTotal){previewNext = 1;}將會使用 。 } else {previewNext = previewCurrent + 1; } 謝謝 – Ryan 2010-03-14 05:11:04

1

我會建議你閱讀Javascript Closures,那麼您將對JavaScript中如何解析標識符有深入的瞭解。

+0

這不是關閉的問題,它是在新範圍內重新聲明變量的問題。 – 2010-03-14 08:09:49

+0

@JustinJohnson它的類型是,OP不明白內部變量(在堆棧中)不會停留在函數的下一次迭代中。在它周圍添加一個閉包,創建一個變量,它可以持續來自setInterval的所有調用。 – 2012-05-05 06:10:01

+0

夠公平(15char) – 2012-06-15 16:54:10

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中瞭解範圍,這些煩惱將消失。

+0

@davehamptonusa;) – 2010-03-14 07:56:59

0

這將保持價值。

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