为什么`const arg = arg`会报“无法在初始化前访问”错误?
问题根本原因
这个报错确实是暂时性死区(Temporal Dead Zone, TDZ) 触发的,你此前对TDZ的适用场景认知存在偏差:TDZ限制的核心是「访问当前作用域内尚未完成初始化的let/const变量」,并不区分访问来源是外层还是内层作用域。
报错代码执行逻辑分析
你给出的报错示例代码:
// Error const test = arg => { { const arg = arg; // Cannot access 'arg' before initialization } }
触发错误的核心步骤:
- JS引擎进入内层块级作用域(也就是
{ const arg = arg; }对应的花括号范围)时,会首先扫描所有let/const声明,发现当前作用域声明了const arg,立刻将这个变量绑定到当前块级作用域,同时将它标记为「未初始化」状态,进入TDZ。 - 执行到
const arg = arg赋值语句时,引擎首先解析右侧的取值表达式arg,变量查找优先匹配当前作用域的arg,但此时这个变量还处在TDZ中,没有完成初始化,因此直接抛出报错。
当前作用域一旦声明了同名的let/const变量,就会屏蔽外层所有同名变量,哪怕赋值的右侧想访问外层的同名变量也不行,因为变量查找会优先命中当前作用域还在TDZ里的变量。
正常示例为何不触发报错
你给出的可运行示例代码:
// Works const test = { func: (arg) => { const obj = { foo: arg, } return obj.foo; } }
整个func函数的作用域内,没有重新声明同名的arg变量,因此赋值foo: arg时,变量查找直接命中已经完成初始化的函数形参arg,不存在TDZ访问问题,因此可以正常运行。
修复方案参考
如果你想在内层块级作用域拿到外层arg的值再赋值给内层变量,只要避免内层变量和外层重名即可:
// 修复后的代码 const test = arg => { { const innerArg = arg; // 不重名,不会命中TDZ,正常取外层arg的值 } }
内容的提问来源于stack exchange,提问作者passionateLearner
相关产品推荐
相关产品推荐

