}
}
})
亲自试一试
那么 nextTick
是怎么做到的呢?为了后面的内容更好理解,这里我们得从 js
的执行机制说起
JS执行机制
我们都知道 JS
是单线程语言,即指某一时间内只能干一件事,有的同学可能会问,为什么 JS
不能是多线程呢?多线程就能同一时间内干多件事情了
是否多线程这个取决于语言的用途,一个很简单的例子,如果同一时间,一个添加了 DOM
,一个删除了 DOM
, 这个时候语言就不知道是该添还是该删了,所以从应用场景来看 JS
只能是单线程
单线程就意味着我们所有的任务都需要排队,后面的任务必须等待前面的任务完成才能执行,如果前面的任务耗时很长,一些从用户角度上不需要等待的任务就会一直等待,这个从体验角度上来讲是不可接受的,所以JS
中就出现了异步的概念
概念
-
同步 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务
-
异步 不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行
运行机制
-
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
-
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
-
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
-
(4)主线程不断重复上面的第三步
image.png
nextTick
现在我们回来vue
中的nextTick
实现很简单,完全是基于语言执行机制实现,直接创建一个异步任务,那么nextTick
自然就达到在同步任务后执行的目的
const p = Promise.resolve()
export function nextTick(fn?: () => void): Promise {
return fn ? p.then(fn) : p
}
亲自试一试
看到这里,有的同学可能又会问,前面我们猜想的 DOM
更新也是异步任务,那他们的这个执行顺序如何保证呢?
别急,在源码中nextTick
还有几个兄弟函数,我们接着往下看
queueJob and queuePostFlushCb
queueJob
维护job列队,有去重逻辑,保证任务的唯一性,每次调用去执行 queueFlush``queuePostFlushCb
维护cb列队,被调用的时候去重,每次调用去执行 queueFlush
const queue: (Job | null)[] = []
export function queueJob(job: Job) {
// 去重
if (!queue.includes(job)) {
queue.push(job)
queueFlush()
}
}
export function queuePostFlushCb(cb: Function | Function[]) {
if (!isArray(cb)) {
postFlushCbs.push(cb)
} else {
postFlushCbs.push(…cb)
}
queueFlush()
}
queueFlush
开启异步任务(nextTick)处理 flushJobs
function queueFlush() {
// 避免重复调用flushJobs
if (!isFlushing && !isFlushPending) {
isFlushPending = true
nextTick(flushJobs)
}
}
flushJobs
处理列队,先对列队进行排序,执行queue
中的job
,处理完后再处理postFlushCbs
, 如果队列没有被清空会递归调用flushJobs
清空队列
function flushJobs(seen?: CountMap) {
isFlushPending = false
isFlushing = true
let job
if (DEV) {
seen = seen || new Map()
}
// Sort queue before flush.
// This ensures that:
// 1. Components are updated from parent to child. (because parent is always
// created before the child so its render effect will have smaller
// priority number)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
文末
js前端的重头戏,值得花大部分时间学习。
推荐通过书籍学习,《 JavaScript 高级程序设计(第 4 版)》你值得拥有。整本书内容质量都很高,尤其是前十章语言基础部分,建议多读几遍。
另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。
学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。
面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。
这是288页的前端面试题
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
试成绩,刷面试题是必须的,除非你样样精通。
这是288页的前端面试题
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-pe4QREC3-1712774852157)]