關於javascript 的 setInterval clearInterval 函式

最近因為要做一些特效的東西, 對setInterval  &  clearInterval 做了一點實驗
發現如下:

1. setInterval 會回傳一個類似指標的東西, 來指涉這個bind 上去的function, 也就是說, 我現在透過setInterval 把函式綁上去, 他會傳給我一個線頭, 以後我不想再讓這個函式繼續跑下去了(setInterval 就是每隔一陣子去做一次綁上去的函式), 我就把該線頭帶入clearInterval, 這用法很基本, 所有網路介紹相關函式的寫法大致上都是這樣的

2. 然而, 這個回傳的"線頭" 型態似乎有點奇怪, 而且難以保存, 我用alert出來, 似乎是整數(各家瀏覽器的數值範圍不同  但都是整數), 但當我用jQuery的data 函式把這個線頭存入某DOM的data時, 發現之後叫用是叫不出來的, 該存入的data 顯示為undefine (use alert)

3. 也就是說, 如果我現在想setInterval  日後當特定事件發生時再行clearInterval, 靠著把線頭存在jQuery DOM element, 日後再取出來用是不行的

4. 為了要達到這種效果, 我大致想到幾種辦法:

  a. 把線頭存在全域變數裡, 但因為這個線頭很多元素都要有, 所以我無法讓他們都共用同一個
  變數, 看來要用全域陣列, 我看線上的demo code 都是這樣做的(存在全域變數), 所以我猜想是
  可行

  b. 在設定 setInterval 時就把想寫的clearInterval 事件寫好, 因為經過測試, 在該setInterval() 所在的
  scope 內線頭還是有資料的(不為undefine), 所以想說, 是不是在線頭資料還存在時, 就設定
  clearInterval 會讓他日後可以找得到, 但經過測試, 發現是不行的, 推測應該是因為js是執行期的
  語言, 所以變數的值仍會以實際執行時的變數環境而定, 那個時候線頭應該已經死了, 所以無
  法停止

  c. 最暴力的方式是乾脆把setInterval 的對象DOM element 整著殺掉(remove() ), 這樣就算綁上去
  的函式沒有直接被取消, 也會因為主體已經不存在而不可能再作用, 這個方式的成功率高, 也
  簡單, 但相對學到的東西就少, 你無法驗證法a. 的可行性
 

留言

熱門文章