你瞅啥呢

2025-07-28 关于js中不写分号会报错的几种情况(Deepseek)

1. 以 ([`/+- 开头的行

  • 这些字符可能被解释为上一行的延续,导致意外结果。

  • 经典案例:

    const a = 1
    [1, 2, 3].forEach(console.log) // 报错:试图将 [1,2,3] 当作 1 的属性访问

    正确写法:

    const a = 1;
    [1, 2, 3].forEach(console.log);

2. 立即执行函数(IIFE)

  • 如果上一行没分号,IIFE 可能被当作函数调用:

    const x = 1
    (function() { console.log('IIFE') })() // 报错:1 被当作函数调用

    正确写法:

    const x = 1;
    (function() { console.log('IIFE') })();

3. 模板字符串或正则表达式

  • 模板字符串或正则可能被误认为是上一行的延续:

    const str = 'Hello'
    `World`.toUpperCase() // 报错:试图将模板字符串当作 'Hello' 的标签函数

    正确写法:

    const str = 'Hello';
    `World`.toUpperCase();

4. returnthrowyieldbreakcontinue 后换行

  • 这些关键字后的内容如果换行,ASI 会提前插入分号:

    function foo() {
      return
        { a: 1 } // 实际返回 undefined
    }

    正确写法:

    function foo() {
      return { a: 1 };
    }

5. importexportletconstvar 后直接换行

  • 某些情况下换行会导致解析错误(较少见,但需注意):

    const a = 1
    export { a } // 无问题,但某些工具链可能要求分号

6. 代码压缩工具(如 Webpack、Rollup)的潜在问题

  • 压缩后的代码可能因缺少分号导致合并错误(现代工具通常能处理,但历史项目需注意)。


总结:何时必须写分号?

  • 当下一行以 ([`/+- 开头时。

  • 在 IIFE、模板字符串、正则等特殊语法前。

  • 在 return/throw 等关键字后需要直接返回值时。

  • 使用老旧工具链或代码压缩时。

 

posted @ 2025-07-28 09:19  叶乘风  阅读(19)  评论(0)    收藏  举报