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

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

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

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

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

                                                              举个例子吧:   let a=1;ajax

                                                                                       console.log("同步任务");浏览器

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

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

                                                               一、其实js会先将全部的同步任务推入到执行栈中;异步

                                                                二、执行栈中的任务所有执行完毕;(若是error致使阻塞,那么将影响到步骤3)性能

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

                                                                四、执行异步任务;

         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(..)。

相关文章
相关标签/搜索