javascript - Javascript 中的评估顺序是连续的吗?

标签 javascript

在一次求职面试中,听到“javascript 可以乱序计算语句”,我感到很困惑。这在多大程度上是正确的?我可以想象出一百种方法来显式无序地评估语句——例如在分时操作系统中。但他似乎说如果我评价

console.log('a')
console.log('b')

Javascript 规范不要求输出首先是 a 然后是 b。我可以想象,如果第一个语句的 IO 阻塞,如果语句在功能上是纯的,即没有副作用,但副作用必须始终按顺序发生,我可以想象评估器可能会尝试评估第二个语句,正确?当然,IO 是一个很大的副作用。

在多大程度上符合规范的 Javascript 可以乱序求值?或者这是沟通不畅的情况?

最佳答案

JavaScript 是单线程的(网络 worker 除外)。时期。 ECMA-262 Language Specification Edition 5.1没有提到乱序执行。在您的简单示例中,这两个语句保证以相同的顺序执行。

此外,单个 JavaScript 代码块永远不会被任何其他代码块打断,例如事件处理程序。这就是长时间运行的代码块导致 UI 卡住的原因:

for(var i = 0; i < 1000000000; ++i) {
    console.log(i);
}

保证上面的代码块永远不会被中断或重新排序。只要循环在运行,所有事件处理程序和超时都会等待单个线程。当然,数字会以正确的顺序出现。

可能乱序执行的是异步超时:

setTimeout(function() {
    console.log('a');
}, 1);
setTimeout(function() {
    console.log('b');
}, 1);

在这里您可能希望首先打印a,但JS 引擎可能会重新排序这些事件。毕竟,您安排这些调用在几乎相同的时间点执行。

关于javascript - Javascript 中的评估顺序是连续的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634216/

相关文章:

javascript - JestJS:如何测试 unix 时间戳

javascript - 后台应用/setTimeout 和推送通知

javascript - 监视变量的值 - Angular2+

抛出的 JavaScript 异常不是类型 "Error"

javascript - 获取多维数组N个元素的所有组合

javascript - 刷新数据时在 ng-repeat 中关闭下拉菜单

Javascript:将变量传递给 Google Charts API

javascript - 如何在选择另一个按钮时停止脚本

javascript - 我无法将类(class)添加到第 n 个 child

javascript - 如何设置 React 组件的样式