javascript子作用域可修改父级var/let变量(未遮蔽时),const变量不可赋值但可改其对象属性;遮蔽时修改局部变量;闭包可持久访问并修改父级变量。

在 JavaScript 中,子作用域(如函数内部、块级作用域)可以直接读取并修改父级作用域中声明的变量,但前提是该变量不是用 const 声明的,且没有被遮蔽(shadowing)。
变量声明方式决定能否修改
使用 var 或 let 声明的变量,在子作用域中可直接赋值修改(只要没被同名变量覆盖);const 声明的变量不能重新赋值,但若其值是对象或数组,其内部属性/元素仍可修改。
-
var和let:允许直接重新赋值 -
const:不允许=赋值,但可改对象属性、数组元素等 - 若子作用域内用
let/const/var声明了同名变量,则会遮蔽父级变量,此时修改的是局部变量,不影响父级
常见情况示例
✅ 正确修改(无遮蔽):
let count = 0;
function inc() {
count = count + 1; // 修改父级 let 变量
}
inc();
console.log(count); // 输出 1
❌ 错误修改(被遮蔽):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
let name = "Alice";
function greet() {
let name = "Bob"; // 新建局部变量,遮蔽父级
name = "Charlie"; // 只改了局部 name
}
greet();
console.log(name); // 仍是 "Alice"
✅ const 对象属性可变:
const user = { age: 25 };
function updateAge() {
user.age = 26; // ✅ 允许(修改对象属性)
// user = { age: 27 }; // ❌ 报错:Cannot assign to const variable
}
updateAge();
console.log(user.age); // 26
闭包中的持久访问
当父函数返回一个子函数时,子函数形成闭包,能持续访问并修改父函数作用域中的变量,即使父函数已执行完毕。
function createCounter() {
let value = 0;
return {
increment() { value++ },
getValue() { return value; }
};
}
const counter = createCounter();
counter.increment();
console.log(counter.getValue()); // 1
注意块级作用域与 var 的区别
let/const 在 if、for 等块中声明,不会提升,也不会泄漏到外层;而 var 会提升且可被函数内任意位置访问修改。
function test() {
if (true) {
var a = 1;
let b = 2;
}
console.log(a); // 1(var 提升,可访问)
// console.log(b); // ReferenceError(let 不跨块访问)
}
不复杂但容易忽略细节。关键看声明方式、是否被遮蔽、以及数据类型是否支持内部修改。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










