JavaScript中非可选分号问题:无分号代码为何触发ReferenceError?
错误原因解析:JavaScript自动分号插入的陷阱
这是JavaScript**自动分号插入(ASI)**机制导致的典型问题,具体拆解如下:
第一段代码里,
let b = 2;末尾的分号明确终止了该行语句,下一行的[a,b] = [b,a]会被正确识别为独立的解构赋值语句,所以能正常交换变量。第二段代码移除分号后,JavaScript的ASI不会在
let b = 2末尾自动插入分号——因为ASI有个规则:如果下一行代码的开头是[、(等符号,会被视为当前语句的延续。于是代码会被解析成:let a = 1 let b = 2[a,b] = [b,a]这里的
2[a,b]会被解释成访问数组2的索引(a,b是逗号运算符,结果为b),但此时b还处于let声明的暂时性死区(TDZ)中——let声明的变量在初始化前无法被访问,所以直接抛出Cannot access 'b' before initialization的错误。
简单说就是:没有分号时,下一行的解构赋值被当成了上一行变量初始化的一部分,提前引用了还没完成初始化的b。
内容的提问来源于stack exchange,提问作者Dimitris
相关产品推荐
相关产品推荐

