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

标签 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

最佳答案

您在 0 之前看到一个数字这一事实告诉我您正在将其粘贴到您的浏览器控制台中。您看到该数字是因为它是在循环中创建的最后一个计时器的句柄。 for 循环(这可能会让很多人感到惊讶,当我第一次了解到它时,它确实让我感到惊讶)导致在其主体 block 的最后一次执行中执行的最后一条语句的返回值。在这种情况下,这是 setTimeout 的返回值,它是一个数字:如果您想取消计时器,您将使用的句柄。 (规范有点难以遵循,但它在 §13.7.4.7 中。)

然后继续显示 0 到 9 的原因是它通过 Function# 创建绑定(bind)函数 安排了 10 个定时回调到 console.log绑定(bind)。这些函数中的每一个,在被调用时,都会转过来调用 console.log,其中 this 引用 console 并传递给它的参数()。

因此:如果您将其粘贴到您的控制台中,您将看到最后一个计时器句柄,后跟 0 到 9。


关于“for 有一个结果”的事情,在你的浏览器控制台试试这个:

for (var i = 0 ; i < 5; ++i) {
    i;
}

您将在控制台中看到 4。 :-)

关于javascript - 这个 setTimeout 是如何工作的?什么是 49221 以及 console.log.bind 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231309/

相关文章:

javascript - 把map当做for循环不返回可以吗

javascript - 什么是 ExtJS 哲学?单页应用?

c++ - 为什么 MessageBox 在我创建的桌面显示窗口,而 AllocConsole 在之前显示它?

javascript - 如何在不刷新chrome页面的情况下清除控制台数据

javascript - 如何向函数回调 Javascript 添加自定义属性

javascript - Google AdWords 服务器端转换跟踪

javascript - 使用 AngularJS 自执行函数

c# - 如何通过读取用户输入将变量添加到我的列表中?

javascript - AngularJS - 验证元素绑定(bind)上的可用电子邮件

java - 如何在javafx时间轴中不断更改键值的目标值?