为了账号安全,请及时绑定邮箱和手机立即绑定

关于闭包的换种思维理解

/*
a();

//执行完后, y就永久消失了,因为没有任何地方再用到这个y了

            function a(){
                var y=5;
                y=2+y;
                alert(y);
            }

//全局变量是不会被回收的,是在函数里面的变量执行完自己的工作之后,就会被回收,释放内存空间。
*/

/*

            var y=a();

            y();//弹出1
            y();//弹出2

//按照作用域划分,执行完之后就是一个新的b

            var z=a();

            z();//弹出1,执行完之后就是一个新的b,所以是1

            y();//弹出3,作用域之间的关系式并列的,毫无其他关系

            function a(argu){
                var x = 0;
                var b=function(){
                    x++;
                    alert(x);
                };
                return b;
            };

*/

/*

            var oDiv=document.getElementsByTagName('div');

            for (var  i=0;i<oDiv.length ;i++ )//先执行函数体,再++
            {   a(i);
                alert(a(i));
                function a(x){
                    oDiv[x].onclick=function(){alert(x)};
                }
            }

//内部函数条用了外部函数的变量,外部函数的变量一直都有用,一直都存在
*/

首先看第一分程序,a()执行完之后,function(){ }里面的y就不再存在了;
再看第二个函数,y(),依次弹出来1,2,3;z()插队在y()里面,弹出来的是1;
最后一个函数,无论执行多少次,依旧有存贮的a(i),其中每一个a(i),就类似于y() z(),是并列的 互不相关的作用域,相对于每个a(i)来说的内部函数都是新的。打开页面,瞬间运行完for循环,内存存储了a(0),a(1),a(2),a(3)。当点击事件触发的时候,在弹出相应的框。直到窗口关闭,这些内存才会被清空,否则一直都会存在。

总结:将全局作用域看作是一个大的闭包,执行完了之后关闭大窗口(右上角关闭),一切都清零。所以相对于大闭包(最外层的函数块)小闭包在相应的作用域使用完之后,就类似于该关闭小窗口了,一切清零。 而未清空的是对全局或者父级作用域还有用的变量,这些也会在使用完之后(右上角关闭)被清空。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消