美文网首页让前端飞
三道题学习JavaScript运行机制

三道题学习JavaScript运行机制

作者: JokerPeng | 来源:发表于2017-06-18 22:42 被阅读0次

    一、第一题

    console.log(1);
    setTimeout(function () {
        console.log(2);
    }, 0);
    console.log(3);
    

    上面这道题的结果比较简单,如下:
    1 3 2

    JavaScript 是单线程的,同一时间只能执行一个任务,前一个任务结束,才会执行后一个任务。但是,为了控制代码的执行顺序,JavaScript有一个任务队列。任务会按照他们被加入队列的顺序执行。

    所有的任务都可以分为两种,一种同步任务,一种异步任务
    这里的setTimeout就是一个异步任务。按照JavaScript单线程机制,从上到下执行,先执行console.log(1),然后执行到setTimeout这个异步任务,异步任务要挂起,先不执行,往下走,执行同步任务console.log(3),执行完再去执行异步任务。

    JavaScript运行机制执行过程中,优先处理同步任务,同步任务处理完,再去响应异步任务。

    二、第二题

    console.log(1);
    setTimeout(function () {
        console.log(2);
    }, 0);
    while (true) {
    
    }
    

    执行结果是:
    1
    按照JavaScript运行机制,同步任务执行,打印1,然后异步任务挂起,执行while循环语句,因为同步的循环条件一直满足,会一直执行,所以不会再回头执行setTimeout这个异步任务。

    这一题考察的是异步任务的执行时间。

    三、第三题

    for (var i = 0; i<4; i++){
        setTimeout(function(){
            console.log(i);
        }, 1000);
    }
    

    执行结果是:一秒后打印4个4
    4 4 4 4

    浏览器会有一个timer模块,主要处理setTimeout和setInterval,定时器到了时间,才会把相应的语句放到异步队列过程中。

    for循环在执行过程中,setTimeout语句并没有放到执行队列中去,但定时器会记住这个任务,因为没到执行时间,同步任务for循环4个循环体很快就结束了,当时间到了,定时器会把setTimeout函数体放到异步队列中,异步队列等待事件循环(Event Loop )执行。

    这一题考察的是异步任务的放入时间执行时间

    相关文章

      网友评论

        本文标题:三道题学习JavaScript运行机制

        本文链接:https://www.haomeiwen.com/subject/slmwqxtx.html