<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<button id="btn">点击</button>
</body>
<script>
const btn=document.getElementById('btn');
btn.onclick=function(){
for (var i = 0; i < 10; ++i) {
setTimeout(function(){
console.log(i)
},0)
}
}
</script>
</html>
先在全局定义变量 i, 然后执行 for 循环,执行一次 for 循环,分别将 i++ 放入函数调用栈队列,
setTimeout 放入task队列 一次。
因为需要将函数调用栈队列里的任务执行结束后,再往下执行task任务
所以 i++ 一直在执行,10次 i++ 执行结束, i 的值为10(为什么不是9?因为 i++ 在值为9时,
还会进行一次i++操作,
最后一个循环完 i 的值为10,不满足条件,不再循环)。
至此,函数调用栈队列任务执行结束,
再去执行task里的十个setTimeout任务,2而此时 i 的值为10,所以输出10 个 10。
for循环中let,var 的经典面试题:for循环中 console.log(i)详解
最新推荐文章于 2023-07-07 11:22:32 发布