2016-12-27 62 views
3

我遇到以下問題。當timer_mou開始計數時,當pause等於closeit時,它不會清除間隔。爲什麼我不能clearInterval在下面的例子中?

缺少什麼我在這裏?

function my_timer(pause){ 
    console.log('function: '+pause); 

    var timer_mou = setInterval(function() { 
     console.log('counting'); 
    }, 5000); 

    if (pause == 'closeit') { 
     clearInterval(timer_mou); 
    }  
} 
+1

爲什麼在if語句中closeit一個字符串? – sachsure

+1

@sachsure我很初學JavaScript。你能解釋我嗎? – EnexoOnoma

回答

4

只要把setInterval了暫停功能在全球範圍內定義變量timer_mou,那麼當你調用你的函數將正確清除而不是定義它的功能,檢查每一個電話吧,下面的工作示例。

希望這會有所幫助。

var i = 0; 
 
var timer; 
 

 
start(); 
 

 
$('#pause').on('click',function(){ 
 
    pause() 
 
}) 
 

 
$('#restart').on('click',function(){ 
 
    restart() 
 
}) 
 

 
function pause(){ 
 
    clearInterval(timer); 
 
} 
 

 
function restart(){ 
 
    i=0; 
 
    pause() 
 
    start(); 
 
} 
 

 
function start(){ 
 
    timer = setInterval(function() { 
 
    i++; 
 
    console.log('Counting '+i); 
 
    },1000); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id='pause'>Pause</button> 
 
<button id='restart'>Restart</button>

+1

請解釋原因(他們每次都會清除一個新的時間間隔,但原始時間間隔將作爲殭屍無限運行)。 – abc123

+0

除了這個雄偉的jQuery之外,你到底加了什麼? –

+0

感謝您的介紹@ K.Daniek,OP代碼定義了函數在每次調用中的時間間隔,而不是全局作用域定義... –

1

您需要定義timer_mou之外的功能。在你的情況下,你將無法清除定時器,因爲你失去了定時器的引用,並且每次調用函數都會創建一個新的定時器實例。

嘗試類似:

var timer_mou; 

function start_timer() { 
    timer_mou = setInterval(function() { 
    console.log('counting'); 
    }, 5000); 
} 

function stop_timer() { 
    clearInterval(timer_mou); 
} 
0

這是與範圍做一個非常惱人的問題。當你在你的函數內部聲明setInterval時,你唯一可以清除的地方就在函數的迭代中。所以,

my_timer("") //Starts a timer in the function 
my_timer("closeit") //Starts a timer in the function, then stops it 
//with the other timer running in the background 

你可以減少問題的事實,你的間隔得到多次聲明,你只能停止它的功能。所以,如果你想my_timer功能啓動定時器,但如果你給它「pauseit」的參數停下來,你可以實現這樣的事情:

function my_timer(pause){ 
    console.log('function: '+pause); 

    if(typeof timer_mou === "undefined"){ //If the interval already exists, don't start a new one 
      timer_mou = //Defines in global scope 
      setInterval(function() { 
       console.log('counting'); 
     }, 5000); 
    } 
    if (pause == 'closeit') { 
     clearInterval(timer_mou); 
    }  
} 

所以,在你的函數的新版本,它會檢查是否定義了間隔,如果沒有定義,請在全球範圍中對其進行定義,以便稍後將其刪除。

在手機上完成,所以這是我格式錯誤和拼寫錯誤的藉口。

相關問題