JavaScript闭包解决循环变量引用问题

作者:木棉

时间:2026-10-25

浏览:647

本文解析JavaScript中循环内函数引用变量导致始终获取最后一个值的常见问题。通过对比直接返回变量与使用闭包按值传递参数的两种实现方式,详细说明了利用立即执行函数将循环变量i的值固定到内部作用域的原理,从而确保每个函数能正确返回对应的索引值。

文章目录

JavaScript闭包解决循环变量引用问题

代码示例如下:

 
<script type="text/javascript">
function createArray() {
var arr = new Array();
for (var i = 0; i < 10; i++) {
arr[i] = function () {
return i;
} 
} 
return arr;
} 
var funcs = createArray();
for (var i = 0; i < funcs.length; i++) {
document.write(funcs[i]() + "<br />");
} 
//上述代码输出结果均为变量i的最终值(即10),共输出10个10,这并非预期行为
//原因分析:每个内部函数均引用createArray函数的活动对象,因此它们共享同一个变量i(按引用传递)
//解决策略:将按引用传递参数转换为按值传递
function createArray() {
var arr = new Array();
for (var i = 0; i < 10; i++) {
arr[i] = function (num) {
return function () {
return num;
} 
} (i);//通过调用该匿名函数来返回内部匿名函数,此步骤实现了参数的按值传递
} 
return arr;
} 
var funcs = createArray();
for (var i = 0; i < funcs.length; i++) {
alert(funcs[i]() + "<br />");
} 
//上述代码输出符合预期结果
</script>

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章