Javascript中的评估顺序是顺序的吗?

Cua*_*due 4 javascript

在求职面试中,我很难听到"javascript可以无序地评估陈述".这到底是什么程度的?我可以想象一百种方法来明确地无序地评估语句 - 例如在分时操作系统中.但他似乎在说,如果我评估

console.log('a')
console.log('b')
Run Code Online (Sandbox Code Playgroud)

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

规范兼容的Javascript在多大程度上可以无序评估?或者这是一个误传的情况?

Tom*_*icz 7

JavaScript是单线程的(除了Web工作者).期.ECMA-262语言规范版5.1没有说明无序执行.在您的简单示例中,这两个语句保证以相同的顺序执行.

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

for(var i = 0; i < 1000000000; ++i) {
    console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

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

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

setTimeout(function() {
    console.log('a');
}, 1);
setTimeout(function() {
    console.log('b');
}, 1);
Run Code Online (Sandbox Code Playgroud)

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