JavaScript闭包机制详解:变量访问与修改
本文解析JavaScript中闭包的核心特性。通过示例说明函数内部如何访问外部变量的最终值,以及闭包如何用于读写外部变量。重点分析循环中闭包捕获变量导致的引用问题,并展示利用闭包封装私有变量的实现方式。
JavaScript闭包变量访问机制
在ECMAScript规范中,函数在声明时能够访问其外部作用域内声明的所有变量。关键在于,函数内部访问这些变量时,获取的是它们在函数执行结束后的最终值,而非声明时的初始值。
这意味着,如果闭包引用的外部变量在后续代码中被修改,闭包内部读取到的将是该变量最新的、最终的数值。
以下示例展示了这一行为的具体表现。
循环中闭包变量引用问题
function fnTest(arr) { for (var i=0;i < arr.length;i++) { arr[i]=function () { alert(i+" | "+arr[i]); }; } } var arr = [0,1,2,3]; fnTest(arr); for (var i=0;i < arr.length;i++) { arr[i](); //始终输出4还有一个undefined因为函数退出后,i值为4,所以访问到的值只有4
//结果会连续弹出4个"4|undefined” }
利用闭包修改外部变量
除了读取外部变量,闭包还可以用于修改其外部作用域中的变量值。
具体实现方式如下所示。
function fnTest() { var a="June"; return { set:function (param) {a = param}, get:function () {return a} }; } var obj = fnTest(); alert(obj.get());//弹出June
obj.set(586); alert(obj.get());//弹出586
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
