中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Jquery真(zhen)的不難~第八(ba)回(hui) JS的閉包(bao)問題

回到目錄

百度百科中對閉包的定義:

  閉包(bao)是(shi)可以包(bao)含自由(you)(you)(未綁定到(dao)特(te)定對(dui)(dui)象(xiang))變(bian)量(liang)的(de)(de)(de)(de)(de)代(dai)碼塊;這(zhe)(zhe)些(xie)變(bian)量(liang)不(bu)是(shi)在(zai)這(zhe)(zhe)個代(dai)碼塊內或者(zhe)任何(he)全局(ju)上(shang)下文中(zhong)定義的(de)(de)(de)(de)(de),而(er)是(shi)在(zai)定義代(dai)碼塊的(de)(de)(de)(de)(de)環境(jing)中(zhong)定義。“閉包(bao)” 一詞來(lai)源于以下兩者(zhe)的(de)(de)(de)(de)(de)結(jie)合:要執行(xing)的(de)(de)(de)(de)(de)代(dai)碼塊(由(you)(you)于自由(you)(you)變(bian)量(liang)被(bei)包(bao)含在(zai)代(dai)碼塊中(zhong),這(zhe)(zhe)些(xie)自由(you)(you)變(bian)量(liang)以及(ji)它們引用的(de)(de)(de)(de)(de)對(dui)(dui)象(xiang)沒有被(bei)釋放)和(he)為自由(you)(you)變(bian)量(liang)提供綁定的(de)(de)(de)(de)(de)計算環境(jing) (作(zuo)用域)。在(zai) Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby 和(he) Python,objective c 等語言中(zhong)都能找到(dao)對(dui)(dui)閉包(bao)不(bu)同程(cheng)度的(de)(de)(de)(de)(de)支持。

占嶺對閉包的定義:

   對于函(han)數(shu)A,它(ta)內(nei)部有子函(han)數(shu)B,A函(han)數(shu)的(de)返回值為(wei)(wei)函(han)數(shu)B,當A函(han)數(shu)的(de)實例被建(jian)立之后,由于還(huan)(huan)存(cun)在(zai)著對函(han)數(shu)B的(de)引用,所以函(han)數(shu)B中的(de)值還(huan)(huan)會存(cun)在(zai)于內(nei)存(cun)中,這(zhe)時(shi)函(han)數(shu)B的(de)這(zhe)種浪費內(nei)存(cun)的(de)行為(wei)(wei)我們稱為(wei)(wei)閉包(bao)!

在理解閉包之前,我們先來看一下JS變量的作用域吧:

所為(wei)使用(yong)域就是一(yi)(yi)個對象(xiang)或者變量的(de)有效(xiao)性的(de)范圍(wei),下面的(de)代碼中詳(xiang)細的(de)說明了(le)這一(yi)(yi)點(dian)

     //變量的(de)作用域(yu)
        function bobo() {
            var a = 1; //只在bobo函數體中有效(xiao)
            b = 1; //聲明(ming)了一個全局變量,在(zai)整個<script>塊中(zhong)有效
            function boboSub() {  //聲(sheng)明一個函(han)數,它只在bobo函(han)數中有效
                var c = 1; //只有boboSub函數(shu)聲(sheng)中有效
                c = c + a; //子函數(shu)中可以使用上級(ji)函數(shu)的變量
            }
        }

通過一個代碼來理解一下閉包吧:

這(zhe)個例(li)子(zi)中有變(bian)量i,它(ta)是父函(han)(han)數(shu)a中的一(yi)個變(bian)量,它(ta)對子(zi)函(han)(han)數(shu)b是可見(jian)的,在函(han)(han)數(shu)b中對它(ta)進行(xing)累加(jia)操作,最后(hou)函(han)(han)數(shu)a將函(han)(han)數(shu)b返回,而由(you)于函(han)(han)數(shu)a對函(han)(han)數(shu)b

存在著地址上的引用,所以,當函數a沒有被釋放時,函數b也不會被釋放,這雖然是不提供的,但在某種情況下是完成一些需求的最佳方式。即浪費的不一定是不好的。

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

它的結果不是0,而是1,這就是閉(bi)合的作用,事實上閉(bi)合將局部(bu)變量B提(ti)升了,默認(ren)情況下(xia),我們先把直接訪問(wen)到函數(shu)A的內部(bu)函數(shu)B,所以閉(bi)包還有一個(ge)提(ti)升變量級別的作用。

  好了,寫到這里,Jquery真(zhen)的不(bu)難系列也就(jiu)寫完了(le)(le)(le),匆匆忙忙,時間不知(zhi)不覺過的很快,在這個(ge)系列中,我(wo)充分投入了(le)(le)(le)進入,可(ke)能(neng)已經(jing)(jing)不是代碼這么簡(jian)單了(le)(le)(le),可(ke)能(neng)在寫作(zuo)的時候帶有一些感情的色彩,這可(ke)能(neng)叫身臨(lin)其境吧,又或者我(wo)走火入魔(mo)了(le)(le)(le),以至于我(wo)已經(jing)(jing)失眠(mian)3天了(le)(le)(le),呵呵!

祝大(da)家早日學有所成吧,好好工作(zuo),好好生(sheng)活(huo)吧!就到這吧。

回到目錄

posted @ 2013-01-18 14:03  張占嶺  閱讀(6479)  評論(3)    收藏  舉報