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 @ 2013-01-18 14:03  张占岭  阅读(6462)  评论(3编辑  收藏  举报