Jquery真的不难~第八回 JS的闭包问题

回到目录

百度百科中对闭包的定义:

  闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境 (作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby 和 Python,objective c 等语言中都能找到对闭包不同程度的支持。

占岭对闭包的定义:

   对于函数A,它内部有子函数B,A函数的返回值为函数B,当A函数的实例被建立之后,由于还存在着对函数B的引用,所以函数B中的值还会存在于内存中,这时函数B的这种浪费内存的行为我们称为闭包!

在理解闭包之前,我们先来看一下JS变量的作用域吧:

所为使用域就是一个对象或者变量的有效性的范围,下面的代码中详细的说明了这一点

复制代码
     //变量的作用域
        function bobo() {
            var a = 1; //只在bobo函数体中有效
            b = 1; //声明了一个全局变量,在整个<script>块中有效
            function boboSub() {  //声明一个函数,它只在bobo函数中有效
                var c = 1; //只有boboSub函数声中有效
                c = c + a; //子函数中可以使用上级函数的变量
            }
        }
复制代码

通过一个代码来理解一下闭包吧:

这个例子中有变量i,它是父函数a中的一个变量,它对子函数b是可见的,在函数b中对它进行累加操作,最后函数a将函数b返回,而由于函数a对函数b

存在着地址上的引用,所以,当函数a没有被释放时,函数b也不会被释放,这虽然是不提供的,但在某种情况下是完成一些需求的最佳方式。即浪费的不一定是不好的。

复制代码
   <script>
        function a() {
            var i = 0;
            function b() {
                alert(++i);
            }
            return b;
        }
        var c = a();
        c();
    </script>
复制代码

它的结果不是0,而是1,这就是闭合的作用,事实上闭合将局部变量B提升了,默认情况下,我们先把直接访问到函数A的内部函数B,所以闭包还有一个提升变量级别的作用。

  好了,写到这里,Jquery真的不难系列也就写完了,匆匆忙忙,时间不知不觉过的很快,在这个系列中,我充分投入了进入,可能已经不是代码这么简单了,可能在写作的时候带有一些感情的色彩,这可能叫身临其境吧,又或者我走火入魔了,以至于我已经失眠3天了,呵呵!

祝大家早日学有所成吧,好好工作,好好生活吧!就到这吧。

回到目录

posted @   张占岭  阅读(6463)  评论(3编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2012-01-18 小小的架构,小小的我
2012-01-18 Js~实现public和private对象,即static修饰符
点击右上角即可分享
微信分享提示