javaScript之setTimeOut()

在使用 setTimeout 時,假設要執行 4 次就如同下面的例子:

for (var i = 0; i < 4; i++)
{
console.log("A="+i);
function A(){
console.log("B="+i);
}
window.setTimeout(A, 0);

}

一般常理判斷結果應該是:
A=0
B=0
A=1
B=1
A=2
B=2
A=3
B=3

實際結果如下:
A=0
A=1
A=2
A=3
B=4
B=4
B=4
B=4

有沒有覺得很奇怪?

這是因為 javascript 屬於單執行序,看起來 window.setTimeout(A, 0); 似乎是馬上執行,但是實際上, for 迴圈裡的 setTimeout 會先放在代執行的堆疊裡,直到 for 迴圈結束,但如此一來到結束時,i 即為 4,所以結果就是堆疊裡的每個待執行任務中的 i 都為 4。

所以比較好的寫法應該是:
<html>
<head>
<script style='javascript' src=''></script>
</head>
<body >


<script type="text/javascript">
var i = 0;
function doAppend(){
if (i++ >= 4){
return;
}
console.log("B="+i);
setTimeout(doAppend, 0);
}//函数定义。只是定义,没有执行。
console.log(i);//i=0
setTimeout(doAppend, 0);//开始执行

</script>
</body>
</html>


跟上面的例子有什麼不同?上面的 setTimeout 每個是獨立的,這個例子的 setTimeout 將 一環接著一環,如此一來,每個 setTimeout 都會有正確的 i 了


-

另外一旦我們想要清除定時器,可以通過將定時時產生的ID標識傳遞給clearTimeout或者clearInterval函數來清除定時,至於使用哪個函數取決於調用的時候使用的是setTimeout還是setInterval。範例如下:
var id = setTimeout ( foo ,  1000 ); 
clearTimeout ( id );

假設我們要清除所有定時器,但由於沒有內置的清除所有定時器的方法,可以採用一種暴力的方式來達到這一目的。
//清空"所有"的定時器
for ( var i = 1 ; i < 1000 ; i ++) {
clearTimeout ( i );
}

可能還有些定時器不會在上面代碼中被清除(如果定時器調用時返回的ID值大於1000),因此我們可以事先保存所有的定時器ID,然後一把清除。


ref:
1、Javascript: setTimeout
[url]http://smlsun.com/blog/2013/02/01/javascript-settimeout/[/url]

2、JavaScript可否多線程? 深入理解JavaScript定時機制
[url]http://www.phpv.net/html/1700.html[/url]


-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值