一个Javascript函数(没有承诺)能保证不间断地运行吗?

cgh8pdjw  于 2023-03-06  发布在  Java
关注(0)|答案(2)|浏览(101)

例如:

let x = 1
setInterval(() => x += 1, 1000)
function f() {
    console.log(x)
    console.log(x)
}

当函数被调用时,是否保证两个输出相同?或者setInterval是否可以在这两个输出之间触发?
我试着搜索MDN关于这个主题的网络文档,但我不熟悉这个概念,不确定我应该寻找哪些页面。

zsbz8rwp

zsbz8rwp1#

你的JavaScript进程可以在任何时候被CPU切换线程所中断,但是JavaScript本身是单线程的,一个函数永远不会被你的应用程序的其他部分所中断。
稍微扩展代码:

let x = 1
setInterval(() => x += 1, 1000)
function f() {
    console.log(x)
    while(1) { /* Program blocks forever, setInteral is never invoked again */ }
    console.log(x)
}

这个程序将导致JavaScript运行时永远挂起,您的setInterval回调将永远不会运行。但是,计算机将继续运行您周围的其他程序,定期暂停JavaScript运行时,以便其他进程可以使用CPU。

qhhrdooz

qhhrdooz2#

setInterval回调在调用堆栈为空之前不会运行,因此我希望x在每次控制台调用时都是一致的。
(我说“在调用时”是因为console.log输出本身不一定是同步的,这样就可以在调用console.log和输出实际出现在控制台之间修改对象。)

相关问题