码迷,mamicode.com
首页 > 编程语言 > 详细

js的线程和同步异步以及console.log机制

时间:2017-09-28 18:03:49      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:没有   上线   .com   两种   ring   tin   后台   var   使用   

  项目上线了,闲下来就写写东西吧。积累了好多东西都没有做笔记~挑几个印象深刻的记录一下吧。

js的同步异步以及单线程问题:

               都知道单线程是js的一大特性。但是通常io(ajax获取服务器数据)、用户/浏览器自执行事件(onclick、onload、onkeyup等等)以及定时器(setTimeout、setInterval)这些异步操作又是怎样工作的呢。

              我们把js的任务分为两种:同步任务,异步任务:

                                                              举个例子吧:   let a=1;

                                                                                       console.log("同步任务");

                                                                                      setTimeout(()=>{console.log("异步任务1");},0);

                                                                                      setTimeout(()=>{console.log("异步任务2");},100);

           这样就应该都很明白了,那么他们是怎么在单线程里面工作的呢?

                                                               1、其实js会先将所有的同步任务推入到执行栈中;

                                                                2、执行栈中的任务全部执行完毕;(如果error导致阻塞,那么将影响到步骤3)

                                                                3、将异步任务(setTimeout)按时间顺序推入任务队列中;

                                                                4、执行异步任务;

         ps:很明显setTimeout和setInterval并不是完全精确。https://github.com/woai30231/javascriptThreadStudy(javascript线程及与线程有关的性能优化)

 

js console.log同步异步?:这个问题是在调试的时候遇到的,我发现有时候console.log并不会给我预期的结果,后来查查资料(参考《你不知道的javascript中卷》第二部分异步和性能 1.1 异步控制台部分)。

                  并没有什么规范或一组需求指定console.* 方法族如何工作——它们并不是JavaScript 正式的一部分,而是由宿主环境(请参考本书的“类型和语法”部分)添加到JavaScript 中的。因此,不同的浏览器

                 和JavaScript 环境可以按照自己的意愿来实现,有时候这会引起混淆。尤其要提出的是,在某些条件下,某些浏览器的console.log(..) 并不会把传入的内容立即输出。出现这种情况的主要原因是,在许

                多程序(不只是JavaScript)中,I/O 是非常低速的阻塞部分。所以,(从页面/UI 的角度来说)浏览器在后台异步处理控制台I/O 能够提高性能,这时用户甚至可能根本意识不到其发生。

          什么意思呢?我们还是举个例子来说:   var  a={name:"小Q"};

                                                                          console.log(a);

                                                                          a.name="snail";

         我们通常认为恰好在执行到console.log(..) 语句的时候会看到a 对象的快照,大多数情况下我们看到的是"小Q”,但是,有时候浏览器可能会吧控制台I/O延迟到后台,这时候我们看到的可能是"snail",到底什么

         时候控制台I/O 会延迟,甚至是否能够被观察到,这都是游移不定的。如果在调试的过程中遇到对象在console.log(..) 语句之后被修改,可你却看到了意料之外的结果,要意识到这可能是这种I/O 的异步化造成的。

         如果遇到这种少见的情况,最好的选择是在JavaScript 调试器中使用断点,而不要依赖控制台输出。次优的方案是把对象序列化到一个字符串中,以强制执行一次“快照”,比如通过JSON.stringify(..)。

js的线程和同步异步以及console.log机制

标签:没有   上线   .com   两种   ring   tin   后台   var   使用   

原文地址:http://www.cnblogs.com/mieQ/p/7607691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!