JavaScript setTimeout() 和数组

Mat*_*luk 0 javascript arrays

有人可以向我解释一下吗:

const array = [0, 1, 2, 4, 8, 16, 32, 16, 8, 4, 2, 1, 0];

for (let i = 0; i < array.length; i++) {
    setTimeout(function () {
        console.log(array[i]);
    }, array[i])
}
Run Code Online (Sandbox Code Playgroud)

为什么这会返回 0 1 1 0 2 2 4 4 8 8 16 16 32,而不是逐一返回数组项?

Wai*_*mal 5

数字一个接一个地出现但是您将看不到这一点,因为您在它们之间设置了非常低的延迟。其中一些会一起出现。这些是具有相同值的array[i]

\n\n

为了更好地看到它们之间的延迟,我建议替换array[i]array [i] * x,其中x是一个数字。看这个:

\n\n

\r\n
\r\n
const array = [0, 1, 2, 4, 8, 16, 32, 16, 8, 4, 2, 1, 0];\r\n\r\nfor (let i = 0; i < array.length; i++) {\r\n    setTimeout(function () {\r\n        console.log(array[i]);\r\n    }, array[i] * 500)\r\n}
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

0 将在 0 \xc3\x97 0.5 = 0 秒后回显。

\n\n

1 将在 1 \xc3\x97 0.5 = 0.5 秒后回显。

\n\n

2 将在 2 \xc3\x97 0.5 = 1 秒后回显。

\n\n

4 将在 4 \xc3\x97 0.5 = 2 秒后回显,依此类推。

\n\n

编辑:如果您询问0 1 1 0记录而不是记录的原因0 0 1 1,很可能是因为计算机需要一些小时间循环遍历数组,并且在到达最后的“0”之前,已经过去了1毫秒,所以它将是是时候记录“1”和“1”了。请注意,增加日志之间的延迟可以解决问题。

\n