JS如何在存在同名局部变量的作用域内访问全局/外层变量
JS中访问被局部变量遮蔽的同名全局变量方案
可以实现,但JS没有PHP的global $var直接调取全局同名变量的语法,需要通过全局宿主对象间接实现,同时要注意全局变量的声明规则:
- 你示例中原代码无法实现预期输出的原因:顶层用
const/let声明的变量属于全局词法作用域,但不会挂载到Node.js的global对象或浏览器的window对象上,所以你写global.a只会拿到undefined,最终输出是undefined 2。
方案1:修改全局变量的声明方式(最简便)
如果允许调整全局变量的声明逻辑,把顶层的const换成var,或者直接把变量挂载到全局对象上,就可以直接按你期望的写法输出:
// Node.js 环境示例 var a = 1; // 顶层var声明会自动挂载到global对象 // 或者直接写 global.a = 1; 效果相同 const func = _ => { const a = 2; console.log(global.a, a); // 输出 1 2,符合预期 }; func();
如果是浏览器环境,把代码里的global替换为window即可。
方案2:全局变量声明不可修改的情况
如果必须保留顶层const a = 1的写法,你可以提前在全局作用域把该变量的引用挂载到全局对象上,间接调取:
const a = 1; // 全局作用域提前存引用 global.__globalA = a; const func = _ => { const a = 2; console.log(global.__globalA, a); // 同样输出 1 2 }; func();
注意:JS的作用域遮蔽规则是固定的,一旦当前作用域声明了同名变量,就没有原生语法可以直接访问被遮蔽的上层词法变量,只能通过提前存储引用的方式间接实现。
内容的提问来源于stack exchange,提问作者iTaMaR
相关产品推荐
相关产品推荐

