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

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

  •  
  •   iamdhj · 2017-10-18 14:41:00 +08:00 · 3413 次点击
    这是一个创建于 2354 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在网上看 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 条回复    2017-10-19 09:47:37 +08:00
    yangg
        1
    yangg  
       2017-10-18 14:43:51 +08:00
    使用 standard,要分号的时候会提示。
    oyhw92
        2
    oyhw92  
       2017-10-18 14:52:19 +08:00
    如果一条语句以“(”、“[”、“/”、“+”、或“-”开始,那么它极有可能和前一条语句合在一起解释。
    leemove
        3
    leemove  
       2017-10-18 14:53:31 +08:00
    行首如果是"(, [, `"上一行必须写分号.
    这是不写分号最低限度的前提.
    coolzjy
        4
    coolzjy  
       2017-10-18 14:55:26 +08:00
    难道这种情况不都会写成

    ;[1, 2, 3]

    ;(function () {})()
    seki
        5
    seki  
       2017-10-18 14:59:25 +08:00
    这种属于特例,特例也并不多,记住了就好了

    个人觉得如果为了这个就每一句加分号不值得
    FrankFang128
        6
    FrankFang128  
       2017-10-18 15:08:42 +08:00
    分号:这锅我不背
    Rice
        7
    Rice  
       2017-10-18 15:14:04 +08:00

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

    运算符也是
    kfll
        10
    kfll  
       2017-10-18 18:23:03 +08:00
    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  
       2017-10-18 18:23:31 +08:00
    还是觉得加分号比较舒服 [233]
    mrtanweijie
        12
    mrtanweijie  
       2017-10-18 18:28:21 +08:00
    用了 standard 之后习惯不用分号了
    fds
        13
    fds  
       2017-10-18 18:30:28 +08:00
    用 prettier 自动给需要的地方加分号
    zthxxx
        14
    zthxxx  
       2017-10-18 18:39:35 +08:00
    不用加分号是因为 JavaScript 有自动分号插入机制帮你加了,但是在一些语法情况下不会自动插入分号,比如一行花括号、方括号和一些运算符号开头,也就是楼上 #2 说的情况,楼主这里只是 [1, 2, 3] 以方括号开头,才导致上下行解析出错,一般情况不也不需要加分号。
    Cbdy
        15
    Cbdy  
       2017-10-18 19:24:05 +08:00 via Android
    一刀切得都加只是掩盖问题,搞清 js 的 asi 机制才是关键
    denano
        16
    denano  
       2017-10-19 09:47:37 +08:00
    [1, 2, 3]前要加分号,属于特例。。
    为了好看的话,应该 let arr = [1, 2, 3],然后 arr.forEach
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2827 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 13:15 · PVG 21:15 · LAX 06:15 · JFK 09:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.