遇到一个 JS 语法错误, 加了分号就可以运行

2023-06-15 16:21:14 +08:00
 lxy42

demo 在 jsfiddle

对 JS 不太熟悉, Google 上搜了一些关键词(semicolon anonymous function syntax error)没找到答案. 为什么一定要在调用匿名函数的上一行语句添加加分号?

3691 次点击
所在节点    JavaScript
29 条回复
vinsony
2023-06-15 16:26:09 +08:00
下面一行是括号,不加分号会被识别成函数执行
rocmax
2023-06-15 16:28:29 +08:00
Write semicolons in ONLY 5 cases
;-less // line starts with unary - operator
;+less // line starts with unary + opeartor
;/less/ // line starts with regexp literal
;[less] // line starts with array initializer
;(less) // line starts with grouping operator, such as IIFE
NOTE: In real-world, only the last case is common.
chnwillliu
2023-06-15 16:32:55 +08:00
function test(a) {
return b => c => b(a,c);
}

test(1)(function (b,c){return b+c})(3)
rekulas
2023-06-15 16:34:47 +08:00
我猜你应该年龄不大,因为上古时期的程序员写 js 都是加了分号的,省略分号是最近 10 年流行起来的
由于始终存在一些例外,所以我其实还是偏向于加分号,因为我喜欢统一
不过做项目的话个人喜好放一边,还是得跟着项目规范走
lujiaxing
2023-06-15 16:36:22 +08:00
它给理解成了
console.log 返回了个函数, 然后后面的括号是在试图调用 console.log 所返回的函数并将括号中的 function 作为 console.log 所返回的函数的参数... 那当然会报错.

本质上, 你的代码等效于:
```
const console = {
log: (str) => (func) => (func(), window.console.log(str))
};

console.log("hello")(() => alert("It's worked!!!"))
```
foolnius
2023-06-15 16:37:03 +08:00
var name = hello
(function () {})()

var name = hello(function () {})()

请问这两者怎么区分
lujiaxing
2023-06-15 16:39:10 +08:00
@rekulas 是的. 现在我司的前端代码规范就是要求语句后没有分号.
谁加分号 `npm run build` 铁报错. jslint 都过去不.
lxy42
2023-06-15 16:40:21 +08:00
谢谢各位, 知道原因了.
chengxy
2023-06-15 16:41:27 +08:00
const f = (a) => {
return (b) => {
return a + b
}
}

f(1)(2)

因为匿名函数有可能再返回一个函数
flyqie
2023-06-15 18:40:06 +08:00
@rekulas #4

虽然现在主要写 go ,但还是不太习惯不加分号。

加分号在某些时候可以使得语句更加清晰明了,也方便排查问题。

真的,不加分号的语言略微有点异端。。
enchilada2020
2023-06-15 19:09:03 +08:00
JS 的话 写不写分号全看个人偏好 我选择两个都要 不会去手打 但必须得有 这种事让编辑器给我补全就行了 这语言本来需要注意的地方就多 对省略分号的支持又不完美 没有分号还得时刻留意这种必须加的情况
不加分号党的理由主要有两个 一是每行多打一个字符 麻烦 还有一个是行尾有分号不美观
因为是编辑器补全的 所以第一点不成立 至于是否美观 全凭个人喜好 还有人觉得行尾没了分号 整行代码都不完整呢…
makelove
2023-06-15 19:13:38 +08:00
@flyqie 现在普及了工具强制代码风格不加分号完全不是问题,且少了些没用符号干扰代码看上去更干净清晰
makelove
2023-06-15 19:16:16 +08:00
@enchilada2020 然而并没有“时刻留意这种必须加的情况”,因为不加都不行现在各类 lint 工具都直接对那些情况报错
enchilada2020
2023-06-15 19:59:37 +08:00
@makelove 正是因为楼主踩了这个坑 所以才有的这贴 楼主这样对 JS 本身都不熟的使用者 连什么时候必须加分号都不知道 你还指望一个新手去研究怎么配语言生态链上的 lint 工具来防止自己踩坑吗。。
luwang
2023-06-15 22:02:42 +08:00
@rocmax 哈哈,只遇到过后面三种,之前最常见的就是 `;(function(){})()` 、`!(function(){})()` 了
tonytonychopper
2023-06-15 22:09:58 +08:00
加不加分号其实无所谓吧,可以用 lint 来偷懒
IamJ
2023-06-15 22:12:25 +08:00
如果一行代码中开头是( ,很多时候会加一个分号写成 ;( 来避免这问题🤣
IvanLi127
2023-06-15 22:49:27 +08:00
如果问这个问题,那么以后一定不要省略分号。。。没有现代工具的情况下,js 不适合省略分号,哪天解决一次冲突都可能人麻掉
Shy07
2023-06-15 23:03:06 +08:00
js 开头加分号规则很好记:[、(、` 作为行开头,前面加分号,防止歧义
dcsuibian
2023-06-15 23:11:14 +08:00
实际上不加分号才是大势所趋。我以前也是加分号党,因为可读性强。后来嘛,懒战胜了一切。

尤其是看了尤雨溪的说法:
至于说 “很难总结什么时候加不加”,其实真的很简单。真正会导致上下行解析出问题的 token 有 5 个:括号,方括号,正则开头的斜杠,加号,减号。我还从没见过实际代码中用正则、加号、减号作为行首的情况,所以总结下来就是一句话:
一行开头是括号或者方括号的时候加上分号就可以了,其他时候全部不需要。
其实即使是这两种情况,在实际代码中也颇为少见。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/949018

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX