为什么JS中使用let在for循环重复声明同名变量不会报错?
let重复声明行为差异的技术逻辑
- 首先明确
let的核心语法规则:ES6规范中,let仅禁止同一词法作用域内的重复声明,跨作用域的同名变量声明不受限制。
示例1报错原因
示例1中两次let v声明都处于同一个顶层作用域(全局作用域),属于同一作用域下的重复声明,因此直接触发语法错误:Uncaught SyntaxError: Identifier 'v' has already been declared
对应代码:
let v = "1"; let v = "1";
示例2不报错的原因
带let声明迭代变量的for循环,每一轮迭代都会创建一个完全独立的块级作用域,各轮次的作用域互相隔离。
示例2中let v = "1"是声明在每一轮迭代的独立作用域内,不同轮次的v属于不同作用域下的独立变量,不存在同一作用域重复声明的情况,因此不会触发报错。
对应代码:
for(let i = 0; i<=2; i++){ let v = "1" }
补充验证
如果在同一轮迭代的同一个块作用域内重复声明v,依然会触发报错,可验证上述逻辑:
for(let i = 0; i<=2; i++){ let v = "1" let v = "2" // 此处会触发重复声明错误 }
内容的提问来源于stack exchange,提问作者Ali Hsaino
相关产品推荐
相关产品推荐

