js--事件--事件循环

来源:互联网 发布:mac版chrome好用吗 编辑:程序博客网 时间:2024/05/02 22:39

关于事件写了一系列文章

关于事件写了一系列文章
1.事件流(事件捕获和事件冒泡)
http://blog.csdn.net/github_34514750/article/details/53067077
2.事件处理程序
http://blog.csdn.net/github_34514750/article/details/53083973
3.事件对象
http://blog.csdn.net/github_34514750/article/details/53084014
4.通用的事件侦听器函数
http://blog.csdn.net/github_34514750/article/details/53084034
5.事件循环(event loop)
本文介绍事件循环
6.事件代理((event delegation)
http://blog.csdn.net/github_34514750/article/details/53067133

1.js是单线程的?什么是同步异步?什么同步异步函数?什么是异步过程?什么是消息队列和事件循环 (event loop)?

事件循环是js的运行机制

js是单线程

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

同步和异步区别

同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,js进行下一步操作。

异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。

同步函数和异步函数区别

假设存在一个函数A:A(args…);

同步函数:如果在函数A返回的时候,调用者就能够得到预期结果(即拿到了预期的返回值或者看到了预期的效果),那么这个函数就是同步的。

异步函数:如果在函数A返回的时候,调用者还不能够得到预期结果,而是需要在将来通过一定的手段得到,那么这个函数就是异步的。

异步过程

主线程发起一个异步请求,相应的工作线程接收请求并告知主线程已收到(异步函数返回);主线程可以继续执行后面的代码,同时工作线程执行异步任务;工作线程完成工作后,通知主线程;主线程收到通知后,执行一定的动作(调用回调函数)。

异步函数通常具有以下的形式:
A(args…, callbackFn)

从主线程的角度看,一个异步过程包括下面两个要素:发起函数(或叫注册函数)A和回调函数callbackFn;它们都是在主线程上调用的,其中注册函数用来发起异步过程,回调函数用来处理结果。

eg:setTimeout(fn, 1000);其中的setTimeout就是异步过程的发起函数,fn是回调函数。

消息队列和事件循环

异步过程中,工作线程在异步操作完成后需要通知主线程。那么这个通知机制是怎样实现的呢?答案是利用消息队列和事件循环。

消息队列:工作线程将消息放到消息队列,消息队列是一个先进先出的队列,它里面存放着各种消息。

事件循环:主线程通过事件循环过程去取消息(消息队列中的每条消息实际上都对应着一个事件。),事件循环是指主线程重复从消息队列中取消息、执行的过程。实际上,主线程只会做一件事情,就是从消息队列里面取消息、执行消息,再取消息、再执行。当消息队列为空时,就会等待直到消息队列变成非空。而且主线程只有在将当前的消息执行完成后,才会去取下一个消息。这种机制就叫做事件循环机制,取一个消息并执行的过程叫做一次循环。

0 0
原创粉丝点击