闭包

按照C语言当中的语法习惯我们要输出1~10十个数字时通常会采用循环的方式

        function test (){
            var arr = [];
            for(var i = 0; i<10; i++){
                arr[i] = function(){
                    document.write(i+" ");
                }
            }return arr;
        }
        var myArr = test();
        for (var j = 0; j < 12; j++){
            myArr[j]();//10 10 10 10 10 10 10 10 10 10
        }
        //形成闭包,函数执行时i已经变成十,所以打印出来的所有值都是10

但是在JavaScript中打印的结果却不是这样。那究竟是为什么?闭包是什么?闭包是怎样形成的?
在了解闭包之前我们还因该了解一下立即执行函数
闭包:当内部函数被保存到外部时会生成闭包。闭包会导致原有的作用域链不被释放造成内存泄漏。
闭包的作用

  • 实现公有变量(在这段代码中num既是一个公有变量)
function add(){
            var num = 0;
            function a(){
                console.log(++num);
            }
            return a;
        }
        var myAdd = add();  
        myAdd();            //1
        myAdd();            //2
        myAdd();            //3
在这段函数执行的过程中发生以下过程
add  defined ==> addAO:var num = 0 ; var a = function a( ) { };
                    GO: var myAdd = add( );
                    //add( );执行后的返回值是 function a( ) { };
add  doing   ==>   aAO: num = 0;
Myadd doing  ==>   aAO: num = 1; 
  • 可以作为缓存(存储结构)
        function eater (){
            var food = ""; //此时food相当于一个隐式的存储结构
            var obj={
                eat : function(){
                    console.log("i am eating" + food);
                    food = "";
                },
                push: function(myF00d){
                    food=myF00d;
                }
            }
            return obj;
        }
        var eater1 = eater();
        eater1.push(" xiaohaibao");
        eater1.eat();//"i am eating xaiohaibao"
  • 可以实现函数封装,属性私有化
  实现属性私有化
        function Bao(name,hobbit){
            var yHobbit = "smoke";
            this.name = name;
            this.hobbit = hobbit;
            this.YHobbit = function(){
                this.hobbit =yHobbit; 
            }
            this.sayYHobbit = function(){
                console.log(yHobbit);
            }
        }
        var xiaohai=new Bao('xioahai','yutingbai')

控制台输出结果
- 模块化开发,防止污染全局变量

        模块化开发
        var bai = (function saybai(){
            var name = "yutingbai";
            function sayname(){
                console.log(name);
            }
            return function (){
                sayname();
            }
        }());
        var bao = (function saybao(){
            var name = "xiaohaibao";
            function sayname(){
                console.log(name);
            }
            return function (){
                sayname();
            }
        }());
        //bai(); ==> yutingbai  bao(); ==>xiaohaibao
        利用立即执行函数以及闭包,使得变量名称不互相干扰

现在开头那个问题对我们来说应该是轻而易举的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值