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天了,呵呵!

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

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM