Skip to main content

Blog Rewired 🍀

Fri Jul 25 2025

JavaScript 中必须用分号的场景

这是一篇短文,不会有过多的细节描述,可能会比较精简。

考虑以下代码:

const world = 1
console.log("hello")
(world + 1).toString()

在 REPL 环境中执行这段代码,由于严格按行执行,所以不会报错,能正常运行。但是,如果作为一个文件执行,则会报错:

Terminal window
TypeError: console.log("hello") is not a function. (In 'console.log("hello")(world + 1)', 'console.log("hello")' is undefined)

在这个例子中,报错信息直接指出了原因所在,不过在其他情况下报错信息不一定如此直观。报错原因如下:

  1. console.log("hello") 的下一行跟随着一个括号。
  2. 这附近的代码被解析为:将 console.log("hello") 返回的结果视作函数,然后调用这个函数。
  3. 因为 console.log("hello") 的返回值为 undefined 而不是函数,所以失败报错。

也就是说,上述的代码等价于以下形式:

const world = 1
const fn = console.log("hello")
fn(world + 1).toString()

为了解决这个问题,只需要在 console.log("hello") 后加上分号即可。这个例子说明了:在项目中最好统一使用带分号的代码风格,写的时候不一定要写分号(除非像这种特殊情况),可以由 formatter 自动整理代码。这也是为什么 prettier 默认风格带有分号。

Leave a comment

0 / 560
CAPTCHA is loading...

Comments

Loading comments...