变量提升
定义:会将变量的声明提升到函数的顶部,而赋值不会.
函数提升的优先级高于变量提升
微任务(Microtask)
定义:
- 微任务是指在当前宏任务执行结束后,立即在当前事件循环迭代中执行的任务。它们可以看作是在当前任务的“尾巴”上添加的任务,优先级高于宏任务。
- 常见类型:
- Promise 回调:当Promise对象的状态改变(从pending变为fulfilled或rejected)时,其对应的then、catch等回调函数会被加入到微任务队列中。
宏任务(Macrotask)
定义:
- 宏任务是指需要排队等待JavaScript引擎空闲时才能执行的任务。它们通常包括一些需要较长时间完成的异步操作。
- setTimeout/setInterval:用于在指定的延迟后执行代码。
- I/O 操作:如网络请求、文件读写等。
- UI 渲染:浏览器在解析HTML、CSS和执行JavaScript后,会进行页面的渲染。
执行顺序优先级
综上所述,JavaScript中的任务执行顺序优先级可以归纳为以下几点:
- 同步任务:优先执行,按照代码书写的顺序依次完成。
- 微任务:在当前宏任务执行完毕后,会立即执行所有可用的微任务。
- 宏任务:在所有同步任务和微任务执行完毕后,才会从任务队列中取出下一个宏任务执行。
- JavaScript的执行顺序是先执行同步任务,然后执行微任务队列中的所有任务,最后才执行宏任务队列中的任务。如果在微任务执行期间产生了新的微任务,它们会被添加到微任务队列的末尾,并在当前微任务队列中的所有任务执行完毕后立即执行。
任务队列(Task Queue)
定义: 任务队列是一种数据结构,用于存放待执行的异步任务。在JavaScript中,由于它是单线程语言,异步任务不能立即在主线程上执行,而是会被放入任务队列中等待,直到主线程上的同步任务执行完毕,才会按照顺序从任务队列中取出任务执行。