[英]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
的执行过程中在执行a
和b
之间切换。 处理器是否总是一次只执行一个函数(如果里面没有 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
,的值x
是NaN
,因为它的值函数之前a
简历是undefined
和执行加法上undefined
导致NaN
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.