javascript - javascript中的函数闭包之前是否需要分号?
问题描述
我想知道这是否是编译器错误,或者这就是它应该的方式。
使用 node.js v10.15.3,此代码会引发错误:
var x
x = false
(function y() { console.log('foo') }())
但是这段代码工作正常:
var x
x = false;
(function y() { console.log('foo') }())
区别在于分号。错误消息是:“TypeError: false is not a function”,所以看起来没有分号,编译器将“false”关键字后面的左括号解析为函数调用,就好像我写了“x = false ()”。我花了很长时间才弄清楚我的代码出了什么问题(这显然比上面的例子更复杂。)这是我生命中的一部分,我不会回来!
我的问题是:为什么?我认为分号不需要在行尾?我刚刚阅读了有关分号插入的 ECMA 规范,试图弄清楚这一点,但对我来说仍然有点模糊。
我想这个故事的寓意就是继续用分号结束所有行。有趣的是,作为一名 C 程序员,这是我的习惯,而我只是想通过删除所有不需要的分号来赶上时代。
解决方案
JavaScript 解析器看到这个
var x
x = false
(function y() { console.log('foo') }())
像这样:
var x;
x = false(function y() { console.log('foo') }());
这意味着您正在尝试false
作为函数调用。这是因为 JS 解析器总是试图获取最长的表达式。
在大多数情况下,编写带或不带分号的 JS 只是样式问题。但是,您需要在以下情况下添加分号:
- 有2行代码,和
- 第一行以可能的标识符(或关键字,like
if
orwhile
)结尾,并且 - 第二行以括号开头。
在这种情况下,分号应添加到第一行的末尾或第二行的开头。
推荐阅读
- api - 如何查看我是否达到了 google 表格/gsuite 中的 API 速率限制?
- javascript - 如何使用 CSS 和 JS 一次为多个模态添加进出过渡效果?
- spring - Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core
- c++ - Message::simbolo 使用未定义的类符号
- css - 在相对 div 中居中图像
- android - 我可以写入 Android 设备上的内部存储以检查设备上是否已安装应用程序吗?
- three.js - 如何在轴上旋转 3D 对象
- c# - 在 ViewComponent 中:此异步方法缺少“等待”运算符,将同步运行
- r - 根据R中的扩展名和目录获取文件
- javascript - 使用 forEach 函数添加选项元素以选择 HTML 元素