字节
问下面这一段放在浏览器执行,会怎么样?
当浏览器执行这段代码时,fn() 会持续地将自身加入到任务队列中,以便在当前执行栈为空时尽快执行。由于 setTimeout 的延迟时间设置为 0,这会导致大量的 fn() 调用被累积在任务队列中,不断地消耗浏览器的资源。
然而,这并不会导致浏览器崩溃或卡死,因为 JavaScript 是单线程的,事件循环会确保每次只执行一个任务。在执行下一个 fn() 之前,浏览器会有机会处理其他任务,如用户交互、渲染更新等。但是,这段代码会导致浏览器的 CPU 使用率较高,影响性能和响应速度。在实际应用中,应避免使用这种递归调用模式。
不断的加入任务队列,但是浏览器不会卡丝,因为宏任务之前会有机会执行其他任务
ts
const fn = ()=>{
setTimeout(()=>{fn();},0)
}
fn();那如果执行这个呢
这段代码不端的将自己加入到微任务队列中,会有大量的 fn 任务积累在微任务队列,这会导致浏览器卡顿
在执行栈为空时,浏览器会先处理微任务队列任务,直到为空,因此浏览器可能无法处理其他任务
ts
const fn = ()=>{
Promise.resolve().then(()=>{fn();})
}
fn();