项目上线了,闲下来就写写东西吧。积累了好多东西都没有作笔记~挑几个印象深入的记录一下吧。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(..)。