循环中闭包

 
 

 

<script type="text/javascript">
        function aa(){
            var a = [];
            var i;
            for (i = 0; i < 3; i++) {
                a[i] = function(){
                    return i;
                };
                
            }
            return a;
        }
        
        var fun = aa();
        alert(fun[0]()); //ouput 3
        alert(fun[1]()); //ouput 3
        alert(fun[2]()); //ouput 3
    </script>
    <script type="text/javascript">
        function aa(){
            var a = [];
            var i;
            for (i = 0; i < 3; i++) {
                a[i] = (function(x){
                    return x;
                })(i);
                
            }
            return a;
        }
        
        var fun = aa();
        alert(fun[0]); //ouput 0
        alert(fun[1]); //ouput 1
        alert(fun[2]); //ouput 2
    </script>
    <script type="text/javascript">
        function aa(){
            var a = [];
            var i;
            function n(x){
                return x;
            }
            for (i = 0; i < 3; i++) {
                a[i] = n(i);
                
            }
            return a;
        }
        
        var fun = aa();
        alert(fun[0]); //ouput 0
        alert(fun[1]); //ouput 1
        alert(fun[2]); //ouput 2
    </script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#闭包是指一个函数能够访问它外部的变量,即使这些变量在函数外部定义。闭包可以在函数内部创建,也可以作为函数的返回值返回。 下面是一个简单的闭包示例: ``` public Func<int, int> Add(int a) { return b => a + b; } // 调用 Func<int, int> add5 = Add(5); int result = add5(3); // result = 8 ``` 在上面的代码,Add方法返回一个匿名函数,这个匿名函数能够访问Add方法的变量a。当我们调用Add(5)时,会返回一个函数,这个函数会将传入的参数b加上a,然后返回结果。 关于foreach闭包,需要注意的是,foreach循环变量会在每次迭代重新赋值,因此如果在循环体内部使用匿名函数访问循环变量,可能会导致意外的结果。例如: ``` List<Func<int>> funcs = new List<Func<int>>(); int[] nums = { 1, 2, 3 }; foreach (int num in nums) { funcs.Add(() => num); } foreach (Func<int> func in funcs) { Console.WriteLine(func()); } ``` 上面的代码,我们在第一个foreach循环向一个List添加了三个匿名函数,这些匿名函数都返回循环变量num。在第二个foreach循环,我们依次调用了这三个函数,期望的结果是输出1、2、3。但实际上,输出的结果都是3,这是因为在第一个foreach循环循环变量num在每次迭代都被重新赋值,而匿名函数访问的是循环变量的引用,最终所有的函数都返回了最后一次迭代的值3。 为了避免这种问题,我们可以在循环体内部创建一个局部变量来保存循环变量的值,然后在匿名函数访问这个局部变量,例如: ``` List<Func<int>> funcs = new List<Func<int>>(); int[] nums = { 1, 2, 3 }; foreach (int num in nums) { int temp = num; funcs.Add(() => temp); } foreach (Func<int> func in funcs) { Console.WriteLine(func()); } ``` 这样就可以输出期望的结果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值