- 事件循环机制是什么?是javascript的执行机制,
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
****主线程从 " 任务队列 " 中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。
\
- js为什么要有事件循环机制
JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。那么问题来了,假如我们想浏览新闻,但是新闻包含的超清图片加载很慢,难道我们的网页要一直卡着直到图片完全显示出来?于是,JavaScript语言的设计者意识到,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。
-
- 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
- 异步任务指的是,不进入主线程、而进入 " 任务队列 " (task queue)的任务,只有 " 任务队列 " 通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。浏览器本身存在一个监听的进程,当主线程执行完毕,他就会去通知异步任务队列,拿一个异步任务到主线程执行。
****注意:那么问题来了,这些异步任务完成后,主线程怎么知道呢?
答案就是回调函数。
例如setTimeout(function(){console.log(1);},50);浏览器异步执行计时操作,当50ms到了后,会触发定时事件,这个时候,就会把回调函数放到任务队列里。整个程序就是通过这样的一个个 事件 驱动起来的。
所以说,js是一直是单线程的,浏览器才是实现异步的那个家伙。
-
-
- 什么是宏任务,微任务
-
\
\
\
- 事件循环机制带来了什么好处
- juejin.cn/post/693226…
\
\
实现一个节流函数。**
**一定时间内,重复执行同一函数,以最后一次为准
function throttle(delay){
var timer**=null**;
return function(){
clearTimeout(timer);
timer**=**setTimeout(function(){
console.log("hello");
},delay);
};
}
var fn**=**throttle(10000);
fn();
fn();
fn(); //hello