JS执行机制

同步——一件事做完之后才能干下一件事,效率低;

异步——同时开始干多件事;

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)
    }
原文地址:https://www.cnblogs.com/wenzizaigaoge/p/10513004.html