闭包问题

探讨JavaScript中闭包及立即执行函数的概念,解析为何数组中函数执行时输出的值均为10,以及如何通过立即执行函数保存每次循环的变量状态,避免变量污染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

function test(){
    var arr=[];
    for(var i=0; i<10; i++){
        arr[i]=function (){
            console.log(i);
        }
    }
    return arr;
}

var myArr=test();
for(var i=0; i<10; i++){
    myArr[i]();
}



arr[i]=function (){
            
        }
是一个 函数表达式  

只有 myArr[i]();时,它里面的语句 console.log(i); 才会执行,输出 i

test函数,在里面定义一个 数组,让每个函数 都由 数组中的一位 接收,形成 函数表达式,最后 返回 数组

执行test,用一个变量 接收,得到的 其实是 数组。

再用 for循环,执行数组的每一位,相当于 把每一个函数 执行

为什么得到的 i都是 10?

因为 i 最终就加到 10

解决:

function test(){
    var arr=[];
    for(var i=0; i<10; i++){
        (function (j){
            arr[j]=function (){
            console.log(j);
           }
        }(i))
    }
    return arr;
}

var myArr=test();
for(var i=0; i<10; i++){
    myArr[i]();
}

在 for里面

   arr[j]=function (){
            console.log(j);}  外面 套了层 立即执行函数

解决原理在于  立即执行函数 保住了每一个i   0,1,2,3…… 每个小函数都被自己的立即函数包裹保存到外部

每个myArr[i]() 执行,小函数输出的i 都是 立即执行函数保存的j

所以,重点在:

1.每个小函数 都有自己的立即执行函数  十个函数 对 十个函数  不是之前 十个函数 对应一个 test函数

i是共同变量  for每次循环 i都++  最后变成10

2.立即执行函数 保存了 每一次的i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值