JavaScript数组解构后交换变量报错:Uncaught ReferenceError: Cannot access 'm' before initialization问题排查
JavaScript数组解构后交换变量报错:Uncaught ReferenceError: Cannot access 'm' before initialization问题排查
嘿,这个问题其实是JavaScript的自动分号插入(ASI)机制在搞鬼!我给你一步步拆解清楚:
首先看你报错的那段代码:
let [m,d] = v.names [m,d] = [d,m]
JavaScript的自动分号插入并不是在所有场景下都会帮你补充分号,这里它会把这两行代码当成同一行来解析,最终变成了这样:
let [m,d] = v.names[m,d] = [d,m]
这时候麻烦就来了:右边的v.names[m,d]里的m和d,在这行代码左侧的let [m,d]声明还没完成初始化时,就被提前引用了。而let声明的变量会进入暂时性死区(TDZ)——在变量声明完成并赋值前,任何对它的访问都会触发ReferenceError,这就是你看到报错的根本原因。
那为什么加个分号就正常了呢?
当你在let [m,d] = v.names后面加上分号;,JavaScript就明确知道这是两行完全独立的代码:
- 第一行完成
m和d的解构赋值,变量成功初始化,脱离了暂时性死区; - 第二行
[m,d] = [d,m]是独立的数组解构交换操作,这时候m和d已经可以正常访问,自然不会再报错。
最后提个小提醒:当你的代码行以[、(、/、+、-这些符号开头时,很容易被ASI机制和上一行合并解析,遇到这种情况,手动添加分号是最稳妥的避坑方式哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

