亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

關于clearTimeout清除標記的問題

我點擊了多次setTimeout()之后啟動了多個計時器,但是每次都賦值給了i變量,按常理來說不應該覆蓋變量所指向的計時器嗎?

為什么我點擊多次clearTimeout()之后計數增加確實變慢了,而且最后停了,這說明確實把每一個計數器都給刪除了呀。但是清除的是i變量指向的那個計數器呀。這里不太明白,為什么明明覆蓋了i所指向的計數器了執行清除方法之后還能一個個的清除計數器

正在回答

1 回答

setTimeout("startCount()",1000);

這個返回的是一個計時器的id,每一個計時器在執行的時候都會有自己的ID,就是沒有這個返回值,這個計時器也會運行下去,你覆蓋的只是i只是這個變量,你不能做到覆蓋計時器,為什么能做到清理計時器,是因為,不斷有新的函數生成新的setTimeout, i的值也在變化,當你點擊取消函數的時候,setTimeout會等這個取消函數執行過以后一秒才開始執行(即使這個取消函數執行時間可以忽略不計),這時候就會把下一秒將要執行的這個i給取消掉,(但是只會取消一個,因為當時的i值是唯一的)

0 回復 有任何疑惑可以回復我~
#1

勾子

這問題問的真好,我想問一下,取消的是這個i變量的同時取消咯計時器嗎?有沒有可能計時器在繼續運行,只是我們不知道,這里跟前面的時鐘事件一樣,有沒有可能運行多個后,雖然取消變量咯,但是仍然在運行,導致越來越卡?
2017-06-08 回復 有任何疑惑可以回復我~
#2

慕勒7123956 回復 勾子

不會取消i的,i只會新的賦值覆蓋,根據i的值,來取消計時器,這個其實不是計時器,是通過函數的調用實現的每秒計時,當你運行多個以后,每次取消,都只會取消一個,但是由于i是不斷在更新的,只要你點擊取消,都是會取消掉一個下一秒執行的計時器的,直到程序里面的將要自信得多個settimeout都被取消
2017-06-08 回復 有任何疑惑可以回復我~
#3

勾子 回復 慕勒7123956

你這回答和上面那個一樣的意思啊,這個我懂咯,我就是想知道通過i變量來取消計時器后,計時器有沒有可能會在后臺繼續運行
2017-06-09 回復 有任何疑惑可以回復我~
#4

慕勒7123956 回復 勾子

不會啊
2017-06-09 回復 有任何疑惑可以回復我~
#5

沫荼 提問者

按照您的這個說法,i變量里面保存的到底是什么呢?為什么可以循環取到已經生成的所有計數器的ID?為什么用clear方法清除的時候填的又是i變量呢?因為按照慕課給的對于clear方法的說明,clear方法需要的參數應該是ID才對。還是說其實i變量本身不是直接存的ID,而且一種保存ID的集合,比如數組,而clear方法內部本身就封裝了通過i變量來取ID的具體代碼實現,所以實際上clear方法傳遞的參數其實是i變量而不是ID?
2017-06-09 回復 有任何疑惑可以回復我~
#6

慕勒7123956 回復 沫荼 提問者

哪里是集合了,只是你的每一個不斷遞歸的startCount()都會對i進行賦值,每一秒中(因為代碼語句的時間基本上可以忽略不計),i都會是下一秒中最后執行的那個setTimeout的ID,所以可以不斷的進行清除,直到清除完,我覺得你應該去輸出一下i值
2017-06-10 回復 有任何疑惑可以回復我~
#7

沫荼 提問者

謝謝,明白了
2017-06-10 回復 有任何疑惑可以回復我~
查看4條回復

舉報

0/150
提交
取消
JavaScript進階篇
  • 參與學習       468972    人
  • 解答問題       22582    個

本課程從如何插入JS代碼開始,帶您進入網頁動態交互世界

進入課程

關于clearTimeout清除標記的問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號