当前位置: 首页 > news >正文

【深度剖析】曾经让人无法理解的事件循环,前端学习路线

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

  • Object.observe

如果两种任务同时出现,事件循环执行是这样的:

  1. 检查大任务队列是否为空,若不为空,则进行下一步,若为空,跳到3

  2. 从大任务队列中取队首(在队列时间最长)的任务进去执行栈中执行(仅仅一个),执行完进入下一步

  3. 检查小任务队列是否为空,若不为空,则进行下一步,否则跳到1

  4. 从小任务队列中取出队首(在队列时间最长)的任务进去事件队列

简而言之,一次事件循环只执行处于 Macrotask 队首的任务,执行完成后,立即执行 Microtask 队列中的所有任务。

基于这个结论来看一个例子:

console.log(1)

setTimeout(function() {

//settimeout1

console.log(2)

}, 0);

const intervalId = setInterval(function() {

//setinterval1

console.log(3)

}, 0)

setTimeout(function() {

//settimeout2

console.log(10)

new Promise(function(resolve) {

//promise1

console.log(11)

resolve()

})

.then(function() {

console.log(12)

})

.then(function() {

console.log(13)

clearInterval(intervalId)

})

}, 0);

//promise2

Promise.resolve()

.then(function() {

console.log(7)

})

.then(function() {

console.log(8)

})

console.log(9)

由上面的理论,一旦遇到异步代码则交给工作线程处理,主线程继续往下执行,所以首先会打印 1 和 9.

接着,执行 Microtask 中的所有任务,所以依次打印 7、8、2 (因为主线程也属于一个 Macrotask

最后,剩余的都是 Macrotask 任务了,所以就依次执行,输出 3、10、11、12、13.

定时器准时吗?


由上面的事件循环机制,引申出一个问题:定时器的时间准确吗?比如,setTimeout(func,100) 真的在 100 毫秒以后执行吗?

答案很遗憾,不是的。

const s = new Date().getSeconds();

setTimeout(function() {

// 输出 “2”,表示回调函数并没有在 500 毫秒之后立即执行

console.log(“Ran after " + (new Date().getSeconds() - s) + " seconds”);

}, 500);

最后

好了,这就是整理的前端从入门到放弃的学习笔记,还有很多没有整理到,我也算是边学边去整理,后续还会慢慢完善,这些相信够你学一阵子了。

做程序员,做前端工程师,真的是一个学习就会有回报的职业,不看出身高低,不看学历强弱,只要你的技术达到应有的水准,就能够得到对应的回报。

学习从来没有一蹴而就,都是持之以恒的,正所谓活到老学到老,真正懂得学习的人,才不会被这个时代的洪流所淘汰。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
统化的资料的朋友,可以添加V获取:vip1024c (备注前端)**
[外链图片转存中…(img-NoagY4dD-1713218493043)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

http://www.lryc.cn/news/339558.html

相关文章:

  • Spring 事务失效总结
  • K8S节点kubectl命令报错x509: certificate signed by unknown authority
  • 【HTML】制作一个简单的实时字体时钟
  • servlet的三个重要的类(httpServlet 、httpServletRequst、 httpServletResponse)
  • 【软考】设计模式之命令模式
  • 波奇学Linux:ip协议
  • Efficient Multimodal learning from data-centric perspective
  • ubuntu下交叉编译ffmpeg到目标架构为aarch架构的系统
  • 【Linux C | 多线程编程】线程同步 | 条件变量(万字详解)
  • 【高阶数据结构】哈希表 {哈希函数和哈希冲突;哈希冲突的解决方案:开放地址法,拉链法;红黑树结构 VS 哈希结构}
  • 嵌入式之计算机网络篇(七)
  • C++|运算符重载(1)|为什么要进行运算符重载
  • 【ARM 裸机】汇编 led 驱动之烧写 bin 文件
  • 计算机网络之CIDR
  • 【无标题】系统思考—智慧共赢座谈会
  • 【Linux C | 多线程编程】线程同步 | 互斥量(互斥锁)介绍和使用
  • mid_360建图和定位
  • ThreadX在STM32上的移植:通用启动文件tx_initialize_low_level.s
  • 【python实战】游戏开发——恐龙跳跃小游戏
  • 成都百洲文化传媒有限公司电商领域的新锐力量
  • 1042: 中缀表达式转换为后缀表达式
  • 避免上下文切换--Linux原子函数
  • 塔面板php7.37.4版本不支持ZipArchive手工安装扩展方法
  • go语言并发实战——日志收集系统(一) 项目前言
  • Android Studio 之 Intent及其参数传递
  • 【黑马头条】-day06自媒体文章上下架-Kafka
  • 非线性特征曲线线性化插补器(CODESYS 完整ST代码)
  • vue3从精通到入门4:diff算法的实现
  • (三)C++自制植物大战僵尸游戏项目结构说明
  • 动态规划专练( 279.完全平方数)