首页 新闻 搜索 专区 学院

为什么这个函数执行结果是0,1,2,而3不做输出

0
[待解决问题]

function fn() {
for(var i = 0; i < 4; i++) {
var tm = setTimeout(function(i){
console.log(i);
clearTimeout(tm);
},10,i)
}
};
fn();

js
陌凡的主页 陌凡 | 菜鸟二级 | 园豆:204
提问于:2020-06-01 09:43
< >
分享
所有回答(3)
0

因为你clearTimeout。。。
这个执行的流程应该是:
循环生成四个timer,然后最后的tm指向最后一个,所以其实你的四个timer的clearTimeout都是clear的最后一个,当然就最后一个不执行了。。。

顾晓北 | 园豆:9955 (大侠五级) | 2020-06-01 09:59
0

你试着执行一下这个:
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都是同一个

南语喃 | 园豆:295 (菜鸟二级) | 2020-06-01 11:20

具体点就是tm是运行时获取的,当执行到clearTimeout(tm),js去获取tm,而最近的tm就是i为4时的tm。
这个是脚本语言的特性之一,编译型语言就不会出现这种情况。

支持(0) 反对(0) 南语喃 | 园豆:295 (菜鸟二级) | 2020-06-01 11:30
0

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 关掉了。

Tom.汤 | 园豆:1977 (小虾三级) | 2020-06-01 11:20

。。。你这?。。。

支持(0) 反对(0) 南语喃 | 园豆:295 (菜鸟二级) | 2020-06-01 11:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册