setTimeout is not working correctly inside "for loop&qu
setTimeout is not working correctly inside "for loop"
当然,代码只做你让它做的事情。
但我很困惑为什么在下面的代码中:
var a = {
0: "Hi",
1: "Bye"
}
for (var b in a) {
setTimeout(function () {
console.log(b);
}, 1000);
}
不是合并"0"然后合并"1"
我只得到两次"1"。
我不知道为什么会这样。对于我正在制作的脚本,我需要这样的设置,但我也遇到了同样的问题。
这是因为您对闭包的使用是错误的。
在这种情况下,您在setTimeout
回调中使用闭包变量b
,但在执行回调之前不会查找变量b
的值,此时的值更新为对象中的最后一个值。
这种情况下的解决方案之一是创建一个局部闭包,如下所示
for (var b in a) {
(function(c){
setTimeout(function () {
console.log(c);
}, 1000);
})(b)
}
演示:Fiddle
也可以这样做
for (var b in a) {
setTimeout(console.log.bind(console, b), 1000);
}
或者像这个
for (var b in a) {
setTimeout(function(c) {
console.log(c)
}.bind(null, b), 1000);
}
甚至像这个
// compatibility varies
for (var b in a) {
setTimeout(function(c) {
console.log(c)
}, 1000, b);
}
相关文章:
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 对于loop.if-仅在经过所有间隔后返回true
- jQuery setTimeOut: in for-loop
- 如何提取“;href"最近列表项中的属性值