在一次求职面试中,听到“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/