推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
iamdhj

js 不加分号导致的运行异常

  •  
  •   iamdhj · Oct 18, 2017 · 4376 views
    This topic created in 3136 days ago, the information mentioned may be changed or developed.

    在网上看 forEach 异步按顺序执行的问题,发现有一个例子直接没有输出,不按顺序执行应该也有输出才对

    const waitFor = (ms) => new Promise(r => setTimeout(r, ms))
    
    [1, 2, 3].forEach(async (num) => {
      await waitFor(50)
      console.log(num)
    })
    
    console.log('Done')
    

         

    开始以为是 async/await 导致的问题,调试、精简一番,发现原来 forEach 语句和上面返回语句拼到一起解析了,Firefox、Chrome 都是同样结果,应该不是解析器问题

    const func = p => p
    
    [1, 2, 3].forEach((num) => {
        console.log(`forEach:${num}`)
    })
    
    console.log('Done')
    
    

         

    最近看到不少 js 不写分号的例子,原本也想转成不写分号省得多按一下键盘,看来暂时还是继续写分号稳妥一点

    16 replies    2017-10-19 09:47:37 +08:00
    yangg
        1
    yangg  
       Oct 18, 2017
    使用 standard,要分号的时候会提示。
    oyhw92
        2
    oyhw92  
       Oct 18, 2017
    如果一条语句以“(”、“[”、“/”、“+”、或“-”开始,那么它极有可能和前一条语句合在一起解释。
    leemove
        3
    leemove  
       Oct 18, 2017
    行首如果是"(, [, `"上一行必须写分号.
    这是不写分号最低限度的前提.
    coolzjy
        4
    coolzjy  
       Oct 18, 2017
    难道这种情况不都会写成

    ;[1, 2, 3]

    ;(function () {})()
    seki
        5
    seki  
       Oct 18, 2017
    这种属于特例,特例也并不多,记住了就好了

    个人觉得如果为了这个就每一句加分号不值得
    FrankFang128
        6
    FrankFang128  
       Oct 18, 2017
    分号:这锅我不背
    Rice
        7
    Rice  
       Oct 18, 2017

    用 lint 工具,会在要加分号的时候提示
    ZhLTE
        8
    ZhLTE  
       Oct 18, 2017
    看了楼上的 。。觉得还不如加呢- -还美观点
    PythonAnswer
        9
    PythonAnswer  
       Oct 18, 2017 via Android
    括号前都加上

    运算符也是
    kfll
        10
    kfll  
       Oct 18, 2017
    https://github.com/standard/standard

    ...
    The Rules
    ...
    No semicolons – It's fine. Really!
    Never start a line with (, [, or `
    This is the only gotcha with omitting semicolons – automatically checked for you!
    More details
    Tompes
        11
    Tompes  
       Oct 18, 2017
    还是觉得加分号比较舒服 [233]
    mrtanweijie
        12
    mrtanweijie  
       Oct 18, 2017
    用了 standard 之后习惯不用分号了
    fds
        13
    fds  
       Oct 18, 2017
    用 prettier 自动给需要的地方加分号
    zthxxx
        14
    zthxxx  
       Oct 18, 2017
    不用加分号是因为 JavaScript 有自动分号插入机制帮你加了,但是在一些语法情况下不会自动插入分号,比如一行花括号、方括号和一些运算符号开头,也就是楼上 #2 说的情况,楼主这里只是 [1, 2, 3] 以方括号开头,才导致上下行解析出错,一般情况不也不需要加分号。
    Cbdy
        15
    Cbdy  
       Oct 18, 2017 via Android
    一刀切得都加只是掩盖问题,搞清 js 的 asi 机制才是关键
    denano
        16
    denano  
       Oct 19, 2017
    [1, 2, 3]前要加分号,属于特例。。
    为了好看的话,应该 let arr = [1, 2, 3],然后 arr.forEach
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1029 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 19:01 · PVG 03:01 · LAX 12:01 · JFK 15:01
    ♥ Do have faith in what you're doing.