美文网首页
js面试小笔记

js面试小笔记

作者: 壹点微尘 | 来源:发表于2018-03-12 08:53 被阅读23次

    每天记录一点点....

    setTimeout

    面试官:“你知道定时器吗?”我:“知道”面试官:“那你说说什么是定时器”我:“定时器是可以用setTimeout来实现的”面试官:“setTimeout(function () { console.log("1") },0);console.log("2");那你说说控制台上输出顺序是什么?”

    console.log('a');
        setTimeout(function(){
        console.log('b');
    },0);
    console.log('c');
    console.log('d');
    

    控制台输出:
    a
    c
    d
    b
    我也不截图了。 知道为什么吗,理论上他延迟时间为0不是应该马上执行吗,不是的。因为setTimeout运行机制说过,必须要等到当前脚本的同步任务和“任务队列”中已有的事件,全部处理完以后,才会执行setTimeout指定的任务。也就是说,setTimeout的真正作用是,在“任务队列”的现有事件的后面再添加一个事件,规定在指定时间执行某段代码。setTimeout添加的事件,会在下一次Event Loop执行。好吧,对事件循环不清楚的推荐看看阮一峰-avaScript 运行机制详解
    原文链接:https://juejin.im/post/5aa4c47af265da239866e236

    promise

    打印以下程序的输出:

    new Promise(resolve => {
        console.log(1);
        resolve(3);
    }).then(num => {
        console.log(num)
    });
    console.log(2)
    

    这道题的输出是123,为什么不是132呢?因为我一直理解Promise是没有异步功能,它只是帮忙解决异步回调的问题,实质上是和回调是一样的,所以如果按照这个想法,resolve之后应该会立刻then。但实际上并不是。难道用了setTimeout?如果在promise里面再加一个promise:

    new Promise(resolve => {
        console.log(1);
        resolve(3);
        Promise.resolve().then(()=> console.log(4))
    }).then(num => {
        console.log(num)
    });
    console.log(2)
    

    执行顺序是1243,第二个Promise的顺序会比第一个的早,所以直观来看也是比较奇怪,这是为什么呢?

    Promise的实现有很多库,有jQuery的deferred,还有很多提供polyfill的,如es6-promiselie等,它们的实现都基于Promise/A+标准,这也是ES6的Promise采用的。

    为了回答上面题目的执行顺序问题,必须得理解Promise是怎么实现的,所以得看那些库是怎么实现的,特别是我错误地认为不存在的Promise的异步是怎么实现的,因为最后一行的console.log(2)它并不是最后执行的,那么必定有某些类似于setTimeout的异步机制让上面同步的代码在异步执行,所以它才能在代码执行完了之后才执行。

    原文链接 (更详细的解释):https://juejin.im/post/5aa3f7b9f265da23766ae5ae

    相关文章

      网友评论

          本文标题:js面试小笔记

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