setInterval 是定時器。閉包
下面是我對setInterval返回值的思考,setInterval()返回的是定時器的id函數
每一個定時器都會有一個id.這個不加以解釋。spa
若一個setInterval執行兩次應視爲生成了兩個定時器,會返回兩個id.blog
下面是我對定時器id的思考:事件
//var timer = null;io
btn.onclick = function (argument) {console
//var timer = null;function
timer=setInterval(function(){變量
console.log('我是定時器'+timer);
},30);
}cli
上面這段代碼,當我把timer放到兩個位置時,即timer做爲全局變量和局部變量會獲得兩種不一樣的結果。
timer做爲全局變量
我在上面說過連續執行兩次setInterval會造成兩個定時器,以此類推,連續執行屢次會造成多個定時器。
上效果圖:
我按了三次按鈕,執行了3次setInterval,便會造成3個定時器。
因爲timer是全局變量,當我點擊第二次按鈕是,個人2號定時器的id會覆蓋個人一號定時器id,一號定時器便找不到了
至關於用clearInterval清除同樣。
timer做爲局部變量
我也點擊了3次按鈕。
由此能夠看到timer做爲局部變量時,雖然說點擊事件函數結束後,局部變量也會銷燬。
可是並不影響定時器的繼續工做,定時器沒有所以被銷燬,並且定時器裏還保存了timer的值。
我就在想定時器是否像一個閉包同樣能夠保存函數裏的環境。他能夠保存timer,固然也能夠保存其餘值,是確定的。
就不上代碼了。
所以我推薦對定時器id的存儲變量的聲明應該是全局變量。
利於清楚定時器,如做爲局部變量定時器的父級函數執行後,定時器的id都找不到了,就沒法清除了。
以上是我實踐中的理解,僅供參考