这个setTimeout如何工作?什么是49221以及console.log.bind是如何工作的?

时间:2016-02-05 18:43:04

标签: javascript console bind settimeout console.log

这个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

1 个答案:

答案 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。 : - )