闭包实例...

本文探讨了JavaScript中闭包的实现方式,包括通过立即执行函数创建闭包以保存循环变量的不同状态,以及使用ES6的let关键字解决传统循环中的作用域问题。

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

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = (function(num){
        //num在这里                                    //原理和上面一种方法一样的,所以可以实现闭包                    
            return function(){                        //在这个闭包里面再写一个匿名函数
                return num;                            
            };                                                                
        })(i)                                                
    }
    return arr;
}
var b = box();                            
alert(b[0]());
alert(box()[0]());

 





function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = function(num){                
            return num;                            
        }(i);                                
    }                                            
    return arr;
}                           
alert(box()[4]);

 匿名函数在执行的时候他本身就传递给了一个变量arr[i],所以匿名函数的圆括号是可以去掉的。

还有一种使用ES6新语法 let 关键字 由于是新语法 各浏览器支持不同

<body>
    <ul id="ul">
        <li>1111</li>
        <li>2222</li>
        <li>3333</li>
        <li>4444</li>
        <li>5555</li>
    </ul>
    
    <script type="text/javascript">
        var oul = document.getElementById("ul");
        var ali = oul.getElementsByTagName("li");
        for(let i = 0; i < ali.length; i++){
            ali[i].onclick = function (){  
                alert(i);   
            }
        }
    </script>
</body>

       使用let,声明的变量仅在块级作用域内有效,当前的 i 只在本轮循环有效,所以每次都是一个新的变量

  可能你会问,如果每一轮循环的变量 i 都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值

  这是因为Javascript引擎内部会记住上一轮循环的值,初始化本轮的变量 i 时,就在上一轮循环的基础上进行计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值