市政工程建设规范免费下载网站,linux网站做301重定向,为什么都用dw做网站,wordpress自定义title众所周知#xff0c;JavaScript 是单线程语言,只能同时执行做一件事(js只有一个线程#xff0c;称之为main thread-主线程)
1.Javascript 运行机制 main thread 主线程和 call-stack 调用栈(执行栈)#xff0c;所有的任务都会被放到调用栈等待主线程执行。 2.Javascript 任…众所周知JavaScript 是单线程语言,只能同时执行做一件事(js只有一个线程称之为main thread-主线程)
1.Javascript 运行机制 main thread 主线程和 call-stack 调用栈(执行栈)所有的任务都会被放到调用栈等待主线程执行。 2.Javascript 任务分为2类同步任务和异步任务异步又分为宏任务和微任务同步和异步任务都是队列所以是先进先出的。 3.执行顺序同步—异步—MicroTask微任务—MacroTask宏任务(异步包含宏任务和微任务异步中微任务是优于宏任务执行的) 概念不懂直接看下方
JS 调用栈
JS调用栈采用的是后进先出(数据结构)的规则当函数执行的时候会被添加到栈的顶部当执行栈执行完成后就会从栈顶移出直到栈内被清空。
它用于存储正在执行的 js代码块及其运行环境。每当创建一个新的执行上下文就会将其添加到调用栈中。这个执行上下文包含了该函数或代码块执行所需的所有变量、参数、作用域等。
MacroTask宏任务
宏任务通常包括整体代码块scriptsetTimeoutsetIntervalsetImmediateI/O 操作等异步操作它们会被推入到宏任务队列中等待执行。当主线程执行完当前任务后会去检查宏任务队列如果队列中有任务就会从队列中取出一个任务执行直到队列为空。
MicroTask微任务
微任务通常包括 Promise 的回调函数process.nextTickMutationObserver 等异步操作它们会被推入到微任务队列中等待执行。当一个宏任务执行完成后会检查微任务队列如果队列中有任务就会依次取出任务执行直到队列为空。注意微任务的执行时机是在当前宏任务执行结束后下一个宏任务开始之前也就是说微任务的执行优先级高于宏任务。
同步和异步事件举例
举例1
console.log(Start);
setTimeout(() console.log(Timeout), 0);
Promise.resolve().then(() console.log(Promise));
console.log(End);上方代码输出顺序:
Start
End
Promise
Timeout举例2:
console.log(Start);
setTimeout(() console.log(Timeout), 0);
Promise.resolve().then(() console.log(Promise));
console.log(End);
setTimeout(() console.log(Timeout 2), 0);
Promise.resolve().then(() console.log(Promise 2));上方代码输出顺序:
Start
End
Promise
Promise 2
Timeout
Timeout 2总结
总结一下当 JavaScript 引擎执行代码时先执行同步任务执行完同步任务后再开始执行异步任务异步任务分宏任务和微任务如果遇到了宏任务会将它放到宏任务队列中等待执行如果遇到了微任务会将它放到微任务队列中等待执行。当主线程执行完当前任务后会先执行微任务队列中的任务直到微任务队列为空再去执行宏任务队列中的任务直到宏任务队列为空。这样就保证了异步任务的执行顺序和及时性避免了可能出现的竞态条件和阻塞情况。 参考文章: 参考①js微宏任务https://www.jb51.net/article/271092.htm 不足的地方请指教~