Event Loop
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、js执行为什么是单线程的?
什么是单线程呢?就是在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。那js为什么是单线程的,简单粗暴的举个例子:如果js被设计了多线程,如果有一个线程要修改一个dom元素,另一个线程要删除这个dom元素,此时浏览器就会一脸茫然,不知所措。所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变
二、任务队列
1.同步任务
在主线程上排队执行的任务,只有前一个任务运行结束,后一个任务才能进行,如果前一个任务耗时很长,那么后一个任务就不得不苦逼的等待,所以,同步有时会很浪费时间
2.异步任务
任务不放在主线程是执行,而是把它放到任务队列当中。只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。异步任务执行如下:
(1)所有同步任务都在主线程上执行,形成一个执行栈。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
三、Event Loop
1.js执行的时候,首先会把同步任务放到执行栈中,把异步任务挂起,等有结果了将其放到任务队列当中(通常指的是回调函数),而不是放在执行栈中
2.当执行栈中的同步任务结束以后,此时主线程闲下来了,就会查看任务队列中是否有任务,如果有的话,将最先进入任务队列的任务加入到执行栈中执行,执行栈中的任务执行完了之后,主线程便又去任务队列中查看是否有任务可执行。
3主线程去任务队列读取任务到执行栈中去执行,这个过程是循环往复的,这便是 Event Loop,事件循环。