前言
根据慕课网的《快速搞定前端技术一面 匹配大厂面试要求》课程所整理的题目,陆续更新
常考面试题
如果你觉得自己对异步该部分知识掌握得已经差不多了,那么你可以不看前面的,直接跳转到最底下查看面试场景题
1.同步、异步的区别是什么?
异步:不会阻塞代码的执行
同步:会阻塞代码执行
同步和异步的差别就在于这条流水线上各个流程的执行顺序不同。
- 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。
2.手写用promise
function myPromise(fn) {
// 回调函数集合
this.callbacks = [];
// resolve 方法
// 往实例上挂载 data
// 依次执行回到函数
function resolve(value) {
setTimeout(() => {
this.data = value;
this.callbacks.forEach((callback) => callback(value));
});
}
// 将 resolve 方法交还
fn(resolve.bind(this));
}
myPromise.prototype.then = function (onResolve) {
return new myPromise((resolve) => {
this.callbacks.push(() => {
// 将结果返回给传入的回调
const res = onResolve(this.data);
// 链式调用 的返回值还是 Promise 对象时
if (res instanceof myPromise) {
res.then(resolve);
} else {
resolve(res);
}
});
});
};
3.手写用promise加载一张图片
function loadImg(src) {
const p = new Promise(
( resolve , reject ) => {
const img = document.createElement('img')
img.onload = () => {
resolve(img)
}
img.onerror