鱼C论坛

 找回密码
 立即注册
查看: 2792|回复: 10

[已解决]关于JS的setTimeout放在for循环中报错

[复制链接]
发表于 2022-3-13 16:46:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:
屏幕截图 2022-03-13 164358.png
下面注释的和for循环是两种写法,但是for循环传入的第一个对象在调用style的时候会报错
屏幕截图 2022-03-13 164521.png
屏幕截图 2022-03-13 164601.png
最佳答案
2022-3-15 19:55:32
setTimeout是异步,就这么放到for循环里用是不行的。两种方法, 一是把异步变成同步,用ES6的Promise来处理,async 和 await 。二是写闭包: (function(){})()。闭包注意不要搞成死循环了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 17:27:35 | 显示全部楼层
obj未定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-15 09:18:28 | 显示全部楼层
i++之后 i等于了length  越界了
类似于python的 [lambda:print(i) for i in range(10)]  生成的列表里面所有的函数都是输出9
我一说你就懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-15 19:55:32 | 显示全部楼层    本楼为最佳答案   
setTimeout是异步,就这么放到for循环里用是不行的。两种方法, 一是把异步变成同步,用ES6的Promise来处理,async 和 await 。二是写闭包: (function(){})()。闭包注意不要搞成死循环了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-16 16:05:06 | 显示全部楼层
_帅 发表于 2022-3-15 19:55
setTimeout是异步,就这么放到for循环里用是不行的。两种方法, 一是把异步变成同步,用ES6的Promise来处理 ...

但是我又发现如果说var i = 1;setInterval(function(){这里访问不到i})
怎么使得匿名函数里面能看到i呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-16 16:10:43 | 显示全部楼层
kogawananari 发表于 2022-3-15 09:18
i++之后 i等于了length  越界了
类似于python的 [lambda:print(i) for i in range(10)]  生成的列表里面 ...

不是越界的问题,他这个语法和python不太一样,i++后再判断,不符合是不会执行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-16 17:51:00 | 显示全部楼层
一只魈咸鱼 发表于 2022-3-16 16:10
不是越界的问题,他这个语法和python不太一样,i++后再判断,不符合是不会执行的

用 for of 可以直接循环 和python一样的语法了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-17 09:05:06 | 显示全部楼层
kogawananari 发表于 2022-3-16 17:51
用 for of 可以直接循环 和python一样的语法了

for in吗,如果是for(var i in obj){},这个obj如果是数组的话i返回的是索引,还得用obj[i]取值,挺麻烦的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-17 09:43:21 | 显示全部楼层
一只魈咸鱼 发表于 2022-3-17 09:05
for in吗,如果是for(var i in obj){},这个obj如果是数组的话i返回的是索引,还得用obj取值,挺麻烦的


for(const i of arr){}  相当于python for in list
for(const i of Object.keys(obj)){}  相当于python for in dict.keys
for(const i of Object.values(obj)){}  相当于python for in dict.values
for(const [k,v] of Object.entries(obj)){} 相当于python for in dict.items

永远别用js的for in
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-17 13:12:47 | 显示全部楼层
kogawananari 发表于 2022-3-17 09:43
for(const i of arr){}  相当于python for in list
for(const i of Object.keys(obj)){}  相当于pytho ...

懂了!第一次知道for of语法,看的教程都是好久前的,他们用的是in
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-17 14:20:25 | 显示全部楼层
一只魈咸鱼 发表于 2022-3-16 16:05
但是我又发现如果说var i = 1;setInterval(function(){这里访问不到i})
怎么使得匿名函数里面能看 ...

let x = 3;
for(var i=0;i<x;i++){
  (function(i){
    setTimeout(()=> {
      console.log(i)
    },1000*i)
  })(i)
}
希望这个能对你有所启发.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-5 15:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表