javascript嵌套函数通过词法作用域和闭包机制访问外部变量:定义时确定作用域链,可读写非const变量,const原始值不可重赋但可改属性,var/let/const作用域规则不同,闭包使外部变量在函数执行后仍有效。

JavaScript 中嵌套函数可以直接访问外部函数的变量,这依赖于**词法作用域(Lexical Scope)**和**闭包(Closure)**机制。只要变量在嵌套函数定义时所处的作用域链中存在,就能被正常读取甚至修改。
变量访问规则:靠作用域链查找
JavaScript 在函数定义时就确定了它能访问哪些变量——不是运行时决定,而是看函数写在哪一层作用域里。内层函数会逐级向上查找变量,直到全局作用域。
- 内部函数可以读取外部函数的参数和局部变量
- 可以修改外部函数中声明的 非 const 声明的变量(如 var、let)
- 不能修改用 const 声明的原始值变量(会报错),但可修改其属性(如 const obj = {}; obj.a = 1 是允许的)
常见写法示例
下面是一个典型例子:
function outer(x) {
let y = 10;
const z = "hello";
function inner() {
console.log(x); // ✅ 可访问参数 x
console.log(y); // ✅ 可访问 let 声明的 y
console.log(z); // ✅ 可访问 const 声明的 z(只读)
y = 20; // ✅ 可重新赋值
// z = "world"; // ❌ TypeError:const 变量不可重新赋值
}
inner();
}
outer(5); // 输出:5、10、"hello"
注意 var 和 let/const 的区别
使用 var 声明的变量存在变量提升,且在函数作用域内共享;而 let/const 具有块级作用域,更安全也更符合直觉。
- 如果在 if 或 for 块中用 var 声明,嵌套函数仍能访问(因为提升到函数顶部)
- 用 let/const 声明则严格遵循块作用域,嵌套函数只能访问它所在块外、但仍在同级或外层函数内的变量
闭包让访问持续有效
即使外部函数执行结束,只要嵌套函数还被引用(比如作为返回值或回调),它依然能访问外部变量——这就是闭包。变量不会被垃圾回收。
function createCounter(start) {
let count = start;
return function() {
count++; // 仍能访问并修改 outer 的 count
return count;
};
}
const counter = createCounter(0);
console.log(counter()); // 1
console.log(counter()); // 2
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











