前景提要
为什么这个函数执行结果是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 显示帮助
使用"Ctrl+Enter"可进行快捷提交,评论支持部分 Markdown 语法:[link](http://example.com) _italic_ **bold** `code`。
< > 分享
分享您的问题
所有回答(3) 0 因为你clearTimeout。。。
这个执行的流程应该是:
循环生成四个timer,然后最后的tm指向最后一个,所以其实你的四个timer的clearTimeout都是clear的最后一个,当然就最后一个不执行了。。。 顾晓北 | 园豆:10022 (专家六级) | 2020-06-01 09:59 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 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 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 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.汤 | 园豆:1978 (小虾三级) | 2020-06-01 11:20 。。。你这?。。。 支持( 0 ) 反对( 0 ) 南语喃 | 园豆:295 (菜鸟二级) | 2020-06-01 11:26 编辑文本 预览 上传图片
Ctrl+Enter键快速提交
清除回答草稿
您需要 登录 以后才能回答,未注册用户请先 注册 。