2013-09-23 160 views
2

我有一個非常簡單的JS setInterval和clearInterval示例不起作用。這裏一定是一個潛在的原因,這是行不通的,我想知道這是爲什麼:Javascript setInterval clearInterval簡單示例不工作說明?

var automessage; 

function turnON() //executed by onclick event A 
{ 
    var automessage = setInterval(function(){ something() }, 2000); 
} 

function turnOff() //executed by onclick event B 
{ 
    clearInterval(automessage); 
} 

function something() 
{ 
    //pulls instant messages 
} 

在這個例子中,最終用戶點擊一個按鈕,啓動定時間隔過程中,單擊另一個按鈕停止定時間隔過程,然後再次點擊開啓按鈕以再次啓動該過程。從本質上講,這將是一個開/關風格的過程。

這不起作用,我試圖找出原因。我可以使Stackoverflow上提供的數百個其他示例工作,但我真的需要一個開/關風格的過程,不僅限於,然後關閉。 setInterval應該能夠隨時打開和關閉。

我真的很感謝任何人的幫助。另外,我不使用任何Jquery庫。

回答

6

automessage被聲明兩次 - 作爲全局變量和局部變量。嘗試:

function turnON() //executed by onclick event A 
{ 
    automessage = setInterval(function(){ something() }, 2000); 
} 
+0

我知道它是很簡單的東西,感謝羅伊! – user175328

2
var automessage; 

function turnON() { //executed by onclick event A 
    automessage = setInterval(function(){ something() }, 2000); 
} 
function turnOff() { //executed by onclick event B 
    clearInterval(automessage); 
} 
function something() { 
    //pulls instant messages 
} 

此代碼應工作。你的工作不正常,因爲在turnON函數的上下文中,你始終在初始化一個名爲automessage的新變量,該變量混淆了全局變量。通過不使用var,您將覆蓋automessage全局變量。

automessage是一個全局變量,所以它可以從任何其他腳本編輯。因爲,恕我直言,它應該是不可能的,我建議你使用封閉封裝和使私人automessage變量(類似模塊化模式應該幫助你,見下文)。

var buttonModule = (function() { 
    var _automessage; 
    function turnON() { //executed by onclick event A 
     _automessage = setInterval(_something, 2000); 
    } 
    function turnOFF() { //executed by onclick event B 
     clearInterval(_automessage); 
    } 
    function _something() { 
     //pulls instant messages 
    } 
    return { 
     turnON: turnON, 
     turnOFF: turnOFF 
    }; 
})(); 

然後你就可以使用這種方式: buttonModule.turnONbuttonModule.turnOFF您點擊裏面的處理程序。

+1

感謝您的反饋LightStyle! – user175328

1

變化

var automessage = setInterval(function(){ something() }, 2000); 

automessage = setInterval(function(){ something() }, 2000); 
在導通()

+0

感謝您的回答,以及... – user175328