例如:
let x = 1 setInterval(() => x += 1, 1000) function f() { console.log(x) console.log(x) }
当函数被调用时,是否保证两个输出相同?或者setInterval是否可以在这两个输出之间触发?我试着搜索MDN关于这个主题的网络文档,但我不熟悉这个概念,不确定我应该寻找哪些页面。
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。
setInterval
qhhrdooz2#
setInterval回调在调用堆栈为空之前不会运行,因此我希望x在每次控制台调用时都是一致的。(我说“在调用时”是因为console.log输出本身不一定是同步的,这样就可以在调用console.log和输出实际出现在控制台之间修改对象。)
x
console.log
2条答案
按热度按时间zsbz8rwp1#
你的JavaScript进程可以在任何时候被CPU切换线程所中断,但是JavaScript本身是单线程的,一个函数永远不会被你的应用程序的其他部分所中断。
稍微扩展代码:
这个程序将导致JavaScript运行时永远挂起,您的
setInterval
回调将永远不会运行。但是,计算机将继续运行您周围的其他程序,定期暂停JavaScript运行时,以便其他进程可以使用CPU。qhhrdooz2#
setInterval
回调在调用堆栈为空之前不会运行,因此我希望x
在每次控制台调用时都是一致的。(我说“在调用时”是因为
console.log
输出本身不一定是同步的,这样就可以在调用console.log和输出实际出现在控制台之间修改对象。)