这个setTimeout如何工作?什么是49221以及console.log.bind是如何工作的?
for(var i = 0; i < 10; i++) {
setTimeout(console.log.bind(console, i), 0);
}
输出
49221
0
1
2
3
4
5
6
7
8
9
答案 0 :(得分:2)
您在0
之前看到一个数字的事实告诉我您将其粘贴到浏览器控制台中。你看到的是这个数字,因为它是循环中创建的最后一个计时器的句柄。 for
循环会(这可能会让很多人读到这个,当我第一次得知它时肯定会这样做)会导致最后一次执行其主体块时执行的语句的返回值。在这种情况下,这是setTimeout
的返回值,这是一个数字:如果要取消计时器,您将使用的句柄。 (规范有点难以理解,但它在§13.7.4.7。)
它继续显示0到9的原因是它通过console.log
创建绑定函数,将10个定时回调计划到Function#bind
。这些函数中的每一个在被调用时都会转过来,并console.log
调用this
引用console
并传递给它的参数(i
)。
因此:如果将其粘贴到控制台中,您将看到最后一个计时器句柄,后跟0到9。
关于“for
有结果”的事情,请在浏览器控制台中尝试:
for (var i = 0 ; i < 5; ++i) {
i;
}
您将在控制台中看到4
。 : - )