浏览器控制台输出在带有 settimeout 的 for 循环中有一个神秘数字?
Browser console output has a mysterious number in for loop with settimeout?
运行 这在控制台上会立即显示一些详细信息,然后是实际的控制台日志。这些细节在不同的浏览器中意味着什么?
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
您的 setTimeout()
调用创建的函数都引用完全相同的变量,即 i
在 for
循环中定义的变量。当循环结束时,i
的值将是 10
,这就是定时器处理程序触发时记录的内容。
您在调用堆栈的末尾安排了 10 个 console.log
语句(当 for 循环完成后的函数 returns 时)。由于此时 i
是 10
,它打印 10
的次数与您使用该处理程序调用 setTimeout
的次数一样多。
编辑
澄清问题后,您看到的是 value of the last expression evaluated。在这种情况下,它是您设置的最后一个超时值。 window.setTimeout
returns 一个可取消且对于选项卡会话唯一的 ID。在这种情况下,浏览器似乎正在增加它们已经存储的计数,所以你得到的增量是 10,因为你在循环中调用了 setTimeout
10 次。
运行 这在控制台上会立即显示一些详细信息,然后是实际的控制台日志。这些细节在不同的浏览器中意味着什么?
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
您的 setTimeout()
调用创建的函数都引用完全相同的变量,即 i
在 for
循环中定义的变量。当循环结束时,i
的值将是 10
,这就是定时器处理程序触发时记录的内容。
您在调用堆栈的末尾安排了 10 个 console.log
语句(当 for 循环完成后的函数 returns 时)。由于此时 i
是 10
,它打印 10
的次数与您使用该处理程序调用 setTimeout
的次数一样多。
编辑
澄清问题后,您看到的是 value of the last expression evaluated。在这种情况下,它是您设置的最后一个超时值。 window.setTimeout
returns 一个可取消且对于选项卡会话唯一的 ID。在这种情况下,浏览器似乎正在增加它们已经存储的计数,所以你得到的增量是 10,因为你在循环中调用了 setTimeout
10 次。