学习JS ES6剩余参数与扩展运算符时遇变量重复声明报错求解
JavaScript中
array变量重复声明报错的原因解释 问题场景
学习ES6剩余参数(rest parameters)和扩展运算符(spread)时,测试以下代码:
const array = ['Javascript', 'PHP', 'RUBY', 'ReactJS']; function logger(...rest){ console.log(rest); } logger(...array);
使用let或const声明array变量时,出现错误:
Uncaught SyntaxError: Identifier 'array' has already been declared
明明没有手动重复声明该变量,却触发了报错,以下是具体原因分析:
报错核心原因
这个错误的本质是当前代码运行的作用域中,array这个标识符已经被用let/const/class这类具有块级作用域的方式声明过了。这类声明遵循「同一作用域内禁止重复声明」的规则,哪怕你自己没写重复代码,也可能是环境或工具提前注入了同名变量。
常见触发场景
- 浏览器控制台预定义变量:部分浏览器的开发者控制台会在全局作用域预注入一些调试用变量,
array可能就是其中之一,且是用const/let声明的,你再次声明自然会冲突。可以在控制台先执行console.log(window.array)来验证是否存在全局的array变量。 - 代码运行上下文冲突:如果这段代码是在某个已存在
array变量的作用域中运行(比如之前加载的脚本已经声明过同名变量,或者在同一个块级作用域内有隐藏的重复声明),也会触发该错误。 - 代码片段工具内部冲突:你使用的代码片段运行工具(即示例中的
snippet组件),可能内部逻辑已经声明了array变量,导致你再次声明时产生冲突。
解决办法
- 修改变量名:最直接有效的方式是把变量名换成不重复的标识符,比如
techLanguages:
const techLanguages = ['Javascript', 'PHP', 'RUBY', 'ReactJS']; function logger(...rest){ console.log(rest); } logger(...techLanguages);
- 检查作用域环境:如果是在浏览器控制台测试,先确认全局作用域是否存在
array变量,再决定是否换名;若必须用array,可以使用var声明(不推荐,因为var存在变量提升和作用域问题,但它允许同一作用域内重复声明)。
内容的提问来源于stack exchange,提问作者Nguyễn Thế Hưng
相关产品推荐
相关产品推荐

