javascript - JavaScript - setTimeout() / clearTimeout()
问题描述
为什么这个函数打印出来0 1 2
而不是0 1 2 3
?
(function fn1(){
for (var i = 0; i < 4; i++) {
var tc=setTimeout(function(i){
console.log(i);
clearTimeout(tc);
}, 10, i);
}
})();
解决方案
var
当然,会被提升,因此在for
循环中tc
(同步)多次重新分配并最终成为final setTimeout
。因此,每次 timeout 函数运行时,它tc
都会引用最后一次迭代的超时时间,并用clearTimeout
. 对于解释器来说,它看起来像这样:
(function fn1() {
var tc;
var i;
for (i = 0; i < 4; i++) {
tc = setTimeout(function(i) {
console.log(i);
clearTimeout(tc);
}, 10, i);
}
})();
如果您想打印出来0 1 2 3
,请let
改用(let
具有块范围,并且未提升)为每次迭代提供单独的绑定tc
:
(function fn1() {
for (let i = 0; i < 4; i++) {
let tc = setTimeout(function(i) {
console.log(i);
clearTimeout(tc);
}, 10, i);
}
})();
推荐阅读
- android - 如何查找没有 Content-desc、资源 ID 或文本属性的元素 xpath
- scala - Scala:使用 Any 时如何区分列表与其他数据类型
- sql - 无法将 if then 逻辑实现到 sql 代码
- amazon-web-services - 通过 Terraform 在可用子网中动态分配 EC2
- php - 批处理未插入到表中
- laravel - 实现 ShouldBroadcast 上的内部服务器
- macos-catalina - 如何仅针对一个特定程序绕过 macOS Catalina 上的网守?
- javascript - 使用本地 javascript 反应 Native WebView
- request - BitBucket 中的拉取请求冲突
- python - Python:退出“牢不可破”的无限循环