JavaScript中for循环内const变量可赋不同值?const用法疑问
const在for...of循环中的用法说明
你对const的认知存在的核心误区是:混淆了「同一作用域下的变量重赋值」和「不同块级作用域下的全新变量声明」两种场景。
const的核心规则是:在同一块级作用域内,const声明的变量只能在声明时赋值一次,后续不允许再对该变量进行重赋值操作,它并没有限制不同作用域下可以声明同名的const变量并赋予不同值。
为什么示例代码可以正常运行?
for...of循环的每一轮迭代都会生成一个独立的块级作用域,你在循环体内写的const index = allStats.indexOf(stat),本质是在每个独立的迭代作用域中分别创建了全新的index变量,各自只赋值一次,完全符合const的使用规则。
你可以把这个逻辑等价理解为如下代码:
// 第一轮迭代作用域 { const index = allStats.indexOf(stat1); console.log(filenames[index], stat1.isFile()); } // 第二轮迭代作用域 { const index = allStats.indexOf(stat2); console.log(filenames[index], stat2.isFile()); } // 后续迭代以此类推
不同块级作用域的同名const变量互不影响,自然不会触发报错。
可对比验证的反例
如果是同一块级作用域下对const变量重赋值,就会触发语法报错,符合你之前的认知:
const index = 0; index = 1; // 抛出TypeError: Assignment to constant variable.
另外如果把const写在传统for循环的头部,也会报错,因为传统for循环的头部变量属于同一个作用域,i++是对同一个变量重赋值:
// 运行报错 for(const i = 0; i < 5; i++){ console.log(i) }
内容的提问来源于stack exchange,提问作者theju112t
相关产品推荐
相关产品推荐

