可能用过这个函数的兄弟们都知道,alertTimeout函数的执行结果是无限循环,事实上stop函数本身并没有问题,如果该语句在这个回调过程外被执行,即单击一下页面中的按钮,是可以停止的。我只想知道为什么,是不是clearTimeout在本身的回调事件队列中就不起作用
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>timeout</title> <script type="text/javascript">
var iMove;
function alertTimeout() { if (iMove) {
stop();
}
alert("something");
iMove = window.setTimeout(alertTimeout, 1000);
} function stop() {clearTimeout(iMove); } window.onload = function() {
alertTimeout();
}
</script>
</head>
<body>
<input type="button" onclick="stop();" />
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>timeout</title> <script type="text/javascript">
var iMove;
function alertTimeout() { if (iMove) {
stop();
}
alert("something");
iMove = window.setTimeout(alertTimeout, 1000);
} function stop() {clearTimeout(iMove); } window.onload = function() {
alertTimeout();
}
</script>
</head>
<body>
<input type="button" onclick="stop();" />
</body>
</html>
setTimeout时,设置了1个定时器,iMove保存这个定时器的编号,到时间后只执行1次。
到运行到alertTimeout时,这个编号的定时器已经不会再次执行了,所以clearTimeout就没什么意义了。
clearTimeout清除指定编号的定时器。
然后再次setTimeout,又生成了一个新的定时器,iMove保存新的定时器编号。LZ可以在setTimeout前后输出下iMove的值看一下。
不过二楼的朋友可以没注意,iMove是全局变量
我们即使不用作实验也可以知道,iMove第一次是undefined,第二次是则是一个计时器编号int值
这个if(iMove),事实上并非二楼朋友说的false,这个判断每次都是走得进去的,如果在判断内输出iMove,是看得到一个int值的
iMove undefined
无需stop
启一个线程 把id赋给iMove
过一秒
alertTimeout
iMove过时
stop无效
启一个线程 把id赋给iMove
过一秒
....
如此反复