我有以下代码:
<!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 fired”的)被执行。但是当我在IE6和IE8中运行相同的代码时,两个回调都被执行。这是我的脚本中的错误还是这些浏览器充满了错误之一?clearTimeout()/clearInterval()能保证在调用它们后不会调用回调函数吗?
var a
和var b
的赋值非常接近,我认为稍微慢一些的IE JavaScript引擎需要更长时间来完成您的log
语句,因此clearTimeout
调用发生在函数已经被调用之后。当分配var b
时,尝试使用2 * int
作为setTimeout
调用,您将不会看到它被调用,因为有足够的延迟来完成var a
调用并清除超时。 - Dave Anderson