一只魈咸鱼 发表于 2022-3-13 16:46:21

关于JS的setTimeout放在for循环中报错

代码如下:

下面注释的和for循环是两种写法,但是for循环传入的第一个对象在调用style的时候会报错


ckblt 发表于 2022-3-13 17:27:35

obj未定义

kogawananari 发表于 2022-3-15 09:18:28

i++之后 i等于了length越界了
类似于python的 生成的列表里面所有的函数都是输出9
我一说你就懂

_帅 发表于 2022-3-15 19:55:32

setTimeout是异步,就这么放到for循环里用是不行的。两种方法, 一是把异步变成同步,用ES6的Promise来处理,async 和 await 。二是写闭包: (function(){})()。闭包注意不要搞成死循环了。

一只魈咸鱼 发表于 2022-3-16 16:05:06

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

但是我又发现如果说var i = 1;setInterval(function(){这里访问不到i})
怎么使得匿名函数里面能看到i呢

一只魈咸鱼 发表于 2022-3-16 16:10:43

kogawananari 发表于 2022-3-15 09:18
i++之后 i等于了length越界了
类似于python的 生成的列表里面 ...

{:10_250:}不是越界的问题,他这个语法和python不太一样,i++后再判断,不符合是不会执行的

kogawananari 发表于 2022-3-16 17:51:00

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

用 for of 可以直接循环 和python一样的语法了

一只魈咸鱼 发表于 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取值,挺麻烦的

kogawananari 发表于 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 of Object.entries(obj)){} 相当于python for in dict.items

永远别用js的for in

一只魈咸鱼 发表于 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{:10_297:}

_帅 发表于 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)
}
希望这个能对你有所启发.
页: [1]
查看完整版本: 关于JS的setTimeout放在for循环中报错