function fn() {
for(var i = 0; i < 4; i++) {
var tm = setTimeout(function(i){
console.log(i);
clearTimeout(tm);
},10,i)
}
};
fn();
因为你clearTimeout。。。
这个执行的流程应该是:
循环生成四个timer,然后最后的tm指向最后一个,所以其实你的四个timer的clearTimeout都是clear的最后一个,当然就最后一个不执行了。。。
你试着执行一下这个:
function fn() {
for(var i = 0; i < 4; i++) {
var tm = setTimeout(function(i){
console.log(i);
console.log(tm);
clearTimeout(tm);
},10,i);
console.log(tm);
}
};
fn();
你就知道你cleartimeout都是同一个
具体点就是tm是运行时获取的,当执行到clearTimeout(tm),js去获取tm,而最近的tm就是i为4时的tm。
这个是脚本语言的特性之一,编译型语言就不会出现这种情况。
function fn() {
for(var i = 0; i < 4; i++) {
var tm = setTimeout(function(i){
console.log(i,tm);
clearTimeout(tm);
},10,i);
console.log(tm);
}
}
fn();
执行上面的代码, 你会发现 clearTimeout 的 tm 都是最后一个, 就是说 最后一个 setTimeOut 被第一个setTimeOut 关掉了。
。。。你这?。。。