千锋教育web前端高频面试题视频教程,kerwin大话前端面试秘籍(附答案)

同步&异步
1、同步任务
同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
2、异步任务
异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。
3、js异步操作包括:
- 定时器
- 事件绑定
- 回调函数可以理解为异步(不是严谨的异步操作)
- AJAX中一般我们都采取异步操作(也可以同步)
- new Promise中的resolve()
4、同步和异步运行机制
- 有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
- 主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
- 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
- 主线程不断重复上面的第三步。只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。
事件循环
简单来说,JS 的事件循环(Event Loop)机制,决定了什么时候该执行哪一行代码。虽然 JS 是单线程的,但浏览器是多线程的,所以 JS 借助浏览器提供的能力,实现了 JS 的异步编程(比如 setTimeout 方法)。如果没有 JS 事件循环,则当浏览器执行一段耗时的 JS 同步代码时,就没有办法及时响应用户的其他操作,从而给用户带来不好的体验。
- 事件循环负责收集事件(如mousemove、setTimeout等),并对事件触发的回调任务进行排队以便在合适的时候执行。先执行宏任务,然后是微任务,然后在开始下一次循环之前执行一些必要的渲染,如此循环往复。
JS 的事件循环主要由这几部分组成:调用栈、web API、微任务队列、宏任务队列调用栈
JS 调用栈(Call Stack)是一个用于记录函数调用的数据结构,它遵循先进后出的原则(LIFO)。当一个函数被调用时,它的执行上下文(包括函数参数、局部变量等)被添加到调用栈的顶部。当函数执行完毕时,它的执行上下文被从调用栈中弹出,控制权回到调用该函数的上一个执行上下文。
web API
JS 的 Web API 是浏览器提供的一组 API,用于与浏览器环境交互,包括 DOM、XMLHttpRequest、Fetch、setTimeout 等。这些 API 不是 JS 语言本身的一部分,而是浏览器提供的扩展,通过这些 API 可以让 JS 与浏览器环境进行交互。
微任务宏任务
微任务队列
微任务队列用于存放微任务,它遵循先进先出的原则(FIFO)。当一个微任务被调度时,它被添加到微任务队列的末端,排队等待 JS 主线程的执行。
宏任务队列
宏任务队列用于存放宏任务,它遵循先进先出的原则(FIFO)。当一个宏任务被调度时,它被添加到宏任务队列的末端,排队等待 JS 主线程的执行。