为什么该场景下JavaScript缺少分号会抛出ReferenceError错误?
报错根因
这个问题是JavaScript的自动分号插入(ASI, Automatic Semicolon Insertion) 规则未按预期工作导致的。
当你没有在let b = 10末尾手动添加分号时,JS解析器会将下一行开头的方括号和上一行的内容拼接,最终代码会被解析为:
let a = 5 let b = 10[a, b] = [b, a];
此时JS会把10[a, b]识别为对数字10的属性访问操作:先计算方括号内的逗号表达式a, b,逗号表达式的返回值为最后一个项的值也就是b,但此时b的声明赋值流程还没完成(整行let b = 10[a, b] = [b, a]还处于解析赋值阶段,b仍在暂时性死区内),所以会抛出b is not defined的引用错误。
补充说明
- 这也是多数前端编码规范强制要求行尾加分号的核心原因之一,可以完全规避ASI的异常解析问题
- 如果你偏好不写分号的编码风格,需要注意所有以
(、[、`、+、-开头的行,必须在行首补一个分号避免和上一行拼接解析,你的代码也可以改成如下写法正常运行:
let a = 5 let b = 10 ;[a, b] = [b, a] console.log(a, b)
内容的提问来源于stack exchange,提问作者Ezio Shiki
相关产品推荐
相关产品推荐

