【发布时间】:2011-05-02 04:55:01
【问题描述】:
我有以下代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<div id="logger"></div>
<script>
function log(txt) {
document.getElementById('logger').innerHTML += txt + '<br>';
}
var int = 10;
var a= setTimeout(function(){
a = null;
log("A fired!");
clearTimeout(b);
b = null;
}, int);
var b = setTimeout(function(){
b = null;
log("B fired!");
clearTimeout(a);
a = null;
}, int);
</script>
</body>
</html>
两个超时回调都应防止另一个超时回调触发。在 Opera、FF 和 Chrome 中,只有第一个(打印“A fire”)被执行。但是当我在 IE6 和 IE8 中运行相同的代码时,两个回调都会被执行。这是我的脚本中的一些错误,还是这些浏览器充满的错误之一? clearTimeout()/clearInterval() 是否保证回调在调用后不会被调用?
【问题讨论】:
-
正如@qwerty 指出你对
var a和var b的分配是如此接近,我认为IE 中稍慢的JavaScript 引擎需要更长的时间来完成你的log语句等等clearTimeout调用发生在该函数已被调用之后。在分配var b时尝试2 * int调用setTimeout,您不会看到它被调用,因为完成var a调用并清除超时的延迟足够长。 -
为 setTimeout 调用尝试 2 * int — 这不好玩 :) 在复杂的脚本中,你不能保证不会同时触发超时。
-
@Egorinsk:也许你可以改变这个问题的接受答案?
-
@robocat 你的答案得分更多我已经改变了接受的答案。
标签: javascript internet-explorer