美文网首页
浅谈js运行机制

浅谈js运行机制

作者: 晴天小猪L | 来源:发表于2017-10-15 17:39 被阅读0次

    js最大的特点就是单线程,也就是说同一时间只能做一件事。原因在于js主要用途是与用户互动,操作DOM。假如是多线程,一个线程想删除DOM,而另一个线程想在这个DOM上增加内容,这样的话就会矛盾。所以注定是单线程。

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

    既然js是单线程,那么不管有多少任务,都要排队,只有一个任务完成,下一个任务才能执行。如果任务耗时很长,那么就要一直等待。但很多时候CPU是闲着的,例如AJAX获取数据是很慢的,只能一直等到数据返回才能执行下个任务。

    所以js设计者意识到这时完全可以把等待中的任务挂起,先执行后续任务,等返回结果后再执行该任务。

    于是,把任务分为同步任务和异步任务。同步任务指在主线程排队的任务,只有一个执行完后才会执行下一个任务。异步任务指的是,不进入主线程,而是进入任务队列的任务,只有当任务队列通知主线程,某个异步任务可执行的时候,主线程才会执行这个任务。

    任务的运行机制:

    (1)所有同步任务都在主线程上,形成一个执行栈;

    (2)除主线程外,还有一个任务队列。只要异步任务执行有了结果,会在任务队列中放一个事件;

    (3)当主线程上的所有同步任务执行完成后,会去读取任务队列,看里面有哪些事件,那些对应的异步任务,结束等待状态,进入主线程被执行。

    (4)主线程不断重复以上三步。

    不得不说一下定时器的使用,可以设置一段时间后再执行事件。

    如果将第二个参数,也就是推迟执行的毫秒数,设置为0时,表示当前代码执行完后,立即执行回调函数,而这里的“当前代码执行完”,指的是执行栈中的所有任务执行完成。

    setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在任务队列的尾部添加一个事件,因此要等到同步任务和任务队列现有的事件都处理完,才会得到执行。

    HTML5标准规定了setTimeout()的第二个参数的最小值(最短间隔),不得低于4毫秒,如果低于这个值,就会自动增加。使用setTimeout()只是将事件插入了任务队列,并不能保证在推迟执行的毫秒数后立即执行,因为前面的任务有可能耗时很长。

    相关文章

      网友评论

          本文标题:浅谈js运行机制

          本文链接:https://www.haomeiwen.com/subject/fzdcuxtx.html