码迷,mamicode.com
首页 > 其他好文 > 详细

闭包实例

时间:2018-06-08 14:32:26      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:for循环   一个   实现   而不是   i++   return   ret   turn   数组   

1,我们先来看一段代码,你认为会输出什么呢?

        var arr=[];
        for(var i=0;i<=2;i++){
            arr[i]=function(){
              return i*2;
            }                
        } 
        console.log([arr[0](),arr[1](),arr[2]()]);

如果你以为会输出[0,2,4],那你就错了,这里会输出[6,6,6],因为在js里,因为在执行arr方法时,此时的i已经变成3了,那么我们的方法可以有自己的变量,而不是用全局的i变量呢,这里就要用到闭包了

2,再看看以下代码,这时候会输出什么呢?

     var arr=[];
        for(var i=0;i<=2;i++){
            (function(j){
                arr[j]=function(){
                    return j*2;
                }
            })(i);
        }
     console.log([arr[0](),arr[1](),arr[2]()]);

对,这个时候会输出你想要的[0,2,4],for循环的自调函数就形成了一个闭包,使arr数组的每个方法都有自己的局部变量j,不会受外界影响

3,不过现在有es6了,我们不须要那么麻烦自已去闭包来保存我们想要的值了,直接用let申明变量就可以实现

       const arr=[];
        for(let i=0;i<=2;i++){
            arr[i]=function(){
                return i*2;
            }
        }
        console.log([arr[0](),arr[1](),arr[2]()]);  

打出来自己运行看看吧,哈哈,es6,是不是非常666

闭包实例

标签:for循环   一个   实现   而不是   i++   return   ret   turn   数组   

原文地址:https://www.cnblogs.com/pfcan66/p/9154806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!