出于对是否会异步启动setTimeout()的好奇,我尝试了以下测试脚本:
function timedText() {
var x = document.getElementById("txt");
setTimeout(function() {
x.value = "1 second"
}, 1000);
setTimeout(function() {
x.value = "2 seconds"
}, 2000);
setTimeout(function() {
x.value = "3 seconds"
}, 3000);
while (true) {}
}<p>Click on the button below. The input field will tell you when two, four, and six seconds have passed.</p>
<button onclick="timedText()">Display timed text</button>
<input type="text" id="txt">
当然,单击该按钮会导致浏览器挂起。
这告诉我,setTimeout()在单独的线程上运行而不是。
但在最近的一次采访中,面试官提出了相反的建议.这是否意味着setTimeout()依赖于浏览器/实现?
发布于 2018-08-22 06:31:18
JavaScript不是多线程的。有一些WebWorkers运行在不同的线程中,但这并不是真正的多线程,更像是多个进程,可以相互通信。
因此,while (true) {}将阻塞js上下文,因为它是一个没完没了的循环。
setTimeout将注册一个函数以供以后执行。但在任何时候,代码都不会在相同的上下文中并行运行。
while (true)本身不一定会创建阻塞循环:
async function sleep(time) {
return new Promise((resolve, _) => setTimeout(resolve, time))
}
async function test(val) {
while (true) {
console.log('in while loop ' + val)
await sleep(1000)
}
}
test('foo')
test('bar')
因此,您可以说,使用await/async,您可以创建某种协作的多任务处理,比如安装,但仍然没有多线程。
发布于 2018-08-22 06:32:00
javascript中没有线程。setTimeout只将委托函数推送到下一次将弹出的堆栈中。你可以读到那个JavaScript和线程
发布于 2018-08-22 06:40:16
这告诉我,setTimeout()并不在单独的线程上运行。
是。JS中只有一个线程。
但在最近的一次采访中,面试官提出了相反的建议.这是否意味着setTimeout()依赖于浏览器/实现?
据我所知,只有引擎从一个浏览器变成另一个浏览器。内部机制是相同的事件循环处理器.
https://stackoverflow.com/questions/51960879
复制相似问题