繁体   English   中英

功能顺序有保证吗?

[英]Is the function order guaranteed?

let x = 0;
function a() {
    console.log("called a()");
    for (let i=0; i<123456789; ++i) {
        x += Math.sqrt(2);
    }
    console.log("x = "+x);
}
function b() {
    x = undefined;
    console.log("called b()");
}
setTimeout(b, 20);
a();

输出:

called a()
x = 174594265.7306214
called b()

b应该早点被调用,但它一直等到函数a完成。

我知道 js 只使用一个线程,但是处理器可以在a的执行过程中在执行ab之间切换。 处理器是否总是一次只执行一个函数(如果里面没有 await)? 在 nodejs 和网站 javascript 中?

编辑:
这是一个等待示例:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
let x = 0;
async function a() {
    console.log("called a()");
    await sleep(1000);
    for (let i=0; i<123456789; ++i) {
        x += Math.sqrt(2);
    }
    console.log("x = "+x);
}
function b() {
    x = undefined;
    console.log("called b()");
}
setTimeout(b, 20);
a();

输出:

called a()
called b()
x = NaN

注意 x 是如何变成 NaN 的,因为b是在a期间执行a

b 应该早点被调用,但它一直等到函数 a 完成。

不。 b应该您的同步代码执行调用因为那是调用传递给setTimeout的函数的时候。

setTimeout回调函数计划在您指定为setTimeout的第二个参数的延迟之后运行。 此延迟是运行使用setTimeout调度的回调函数所需的最短时间。

一旦计时器到期,该回调函数就会被放入一个任务队列,并从那里被推送到调用堆栈,但只有在调用堆栈为空时才会被推送。

在您的情况下,当您的脚本完成执行时,调用堆栈将为空。

我知道 js 只使用一个线程,但是处理器可以在 a 的执行过程中在执行 a 和 b 之间切换

只有 1 个线程是不可能的。 在 Javascript 中,除非您使用另一个线程,否则在给定时间只执行一件事。

处理器是否总是一次只执行一个函数(如果里面没有 await)

是的。 即使使用await ,函数也会暂停,直到承诺完成。 一旦 promise 成立,该函数将继续执行,并且此时不会执行任何其他操作。

编辑

注意 x 是如何变成 NaN 的,因为 b 是在 a 期间执行的

不,这里没有干扰。 函数a同步执行,直到下面的语句

await sleep(1000);

当函数a暂停时,等待sleep(...)返回的promise解决,在此期间,函数b被执行,因为它的定时器已经过期并且调用堆栈为空。

由于两者的功能分配给相同的变量x ,的值xNaN ,因为它的值函数之前a简历是undefined和执行加法上undefined导致NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM