解构赋值不创建新作用域,变量作用域由声明方式(let/const/var)和位置决定:let/const解构为块级局部变量;函数参数解构为函数局部变量;var解构具函数作用域且会提升;未声明直接解构在非严格模式下可能创建全局变量。

解构赋值本身不会创建新的作用域,但它可以在已有作用域(如函数作用域、块作用域)中声明局部变量。关键在于:变量的“局部性”由 声明方式(let、const、var)和 所在位置(是否在块或函数内)决定,而不是解构语法本身。
用 let 或 const 在块级作用域中解构
在 {} 块内使用 let/const 解构,生成的变量仅在该块内有效:
{
const [a, b] = [1, 2]; // a、b 是块级局部变量
console.log(a); // 1
}
console.log(a); // ReferenceError: a is not defined
在函数参数中解构 → 创建函数局部变量
函数参数列表支持解构,解构出的形参天然属于该函数的局部作用域:
function foo([x, y], { name }) {
console.log(x, name); // x 和 name 是函数内局部变量
}
foo([10, 20], { name: 'Alice' });
用 var 解构 → 变量提升,作用域为函数级(非块级)
var 声明不受块限制,即使在 {} 中解构,变量也会被提升到函数顶部:
function example() {
{
var [c] = [3];
}
console.log(c); // 3 —— c 是函数作用域变量,不是块级
避免意外全局变量:必须显式声明
解构赋值不能脱离声明语句独立存在。以下写法会报错或创建全局变量(非严格模式下):
-
[x, y] = [1, 2];→ 报错(ReferenceError),除非x、y已声明 -
let x; [x] = [1];→ 合法,复用已声明变量 -
[globalVar] = [1];(非严格模式 + 未声明)→ 意外挂到window上,应始终用let/const显式声明
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











