同步——一件事做完之后才能干下一件事,效率低;
异步——同时开始干多件事;
JS是单线程执行的,即同步执行,因为前端面对的问题是与用户的交互,若是同时获取事件,比如若是对获取到的同一节点需要作不同操作,会乱套,因此JS是单线程的。但是,如果一直都是同步执行,等一件事做完再去做另一件事,无疑非常耗时,用户体验会很差,因此,又需要JS去异步执行某些操作。
JS中常见异步编程方式有:
1、回调函数——解决异步编程最基本的方法
2、发布订阅、通知
3、事件监听
4、ES 6: Promise
5、ES 7: * async和await
经典面试题:
for(var i=0;i<5;i++){ console.log(i); //0 1 2 3 4 } for(var j=0;j<5;j++){ setInterval(function () { console.log(j); //5 5 5 5 5 5..... },1000) } for(var j=0;j<5;j++){ setTimeout(function () { console.log(j); //=>5 5 5 5 5 },1000) }
会出现上述结果的原因在于for是同步事件,setTimeout是异步事件,同步事件先执行,异步事件则被放入队列里等待执行。等for执行完,j已经变成了5。
//解决方案1,闭包,实时保存一个j给setTimeout for(var j=0;j<5;j++){ (function(j){ setTimeout(function () { console.log(j); //=>0=>1=>2=>3=>4 },1000) })(j); } //解决方案2,let for(let j=0;j<5;j++){ setTimeout(function () { console.log(j); },1000) }