V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
denano
V2EX  ›  JavaScript

请教一个关于执行顺序的问题

  •  
  •   denano · 2018-04-25 10:13:22 +08:00 · 3792 次点击
    这是一个创建于 2440 天前的主题,其中的信息可能已经有所发展或是发生改变。
    new Promise(function(resolve) {
      resolve(console.log(1))
    }).then(function() {
      console.log(2)
    })
    console.log(3)
    setTimeout(function() {
      console.log(4)
    }, 0)
    

    想请教下 2 为什么一定会比 4 先输出,自己缺失了哪方面的知识。。

    9 条回复    2018-04-25 14:23:45 +08:00
    afpro
        1
    afpro  
       2018-04-25 10:19:20 +08:00
    你在最后一行加一个 console.log(5) 再看一下结果应该就想明白了
    afpro
        2
    afpro  
       2018-04-25 10:21:06 +08:00
    顺带科普一个常识 现有的 javascript 解释器都是单线程的
    momocraft
        3
    momocraft  
       2018-04-25 10:29:58 +08:00   ❤️ 1
    eventloop / task queue

    理论上这是给浏览器用的标准 ( HTML5 ),实际上大家都和浏览器做得差不多。
    zhengxiaowai
        4
    zhengxiaowai  
       2018-04-25 10:34:54 +08:00   ❤️ 1
    denano
        5
    denano  
    OP
       2018-04-25 10:38:08 +08:00
    @momocraft
    @zhengxiaowai
    谢谢,明白了
    autoxbc
        6
    autoxbc  
       2018-04-25 10:57:29 +08:00 via iPhone
    Promise 的构造函数是同步代码,then 方法的回调函数是异步代码,异步代码按照抛出他们的同步代码的顺序加入队列

    同步异步单线程这些是 js 基础,高级程序设计里有; Promise 原理可以看 Promise 小书,不过小书对两者的返回值讲的不清楚,还要看一下 MDN; 最后可以看 Promise 规范,有完整中文版
    sujin190
        7
    sujin190  
       2018-04-25 11:29:53 +08:00
    而且 setTimeout 实际是有最小延时时间的,并不能是 0,好像是 4ms 吧
    chairuosen
        8
    chairuosen  
       2018-04-25 11:35:39 +08:00
    kisnows
        9
    kisnows  
       2018-04-25 14:23:45 +08:00
    看一下 event loop 方面的知识就清楚了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2687 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:11 · PVG 16:11 · LAX 00:11 · JFK 03:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.