成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

閉包的理解

oliverhuang / 2200人閱讀

摘要:什么是閉包在維基百科上對與閉包的理解是這樣的閉包是引用了自由變量的函數(shù)。則這些規(guī)則也是閉包的一部分。和函數(shù)具有涵蓋模塊實例內(nèi)部作用域的閉包,當(dāng)通過返回一個含有屬性引用的對象方式來講函數(shù)傳遞到詞法作用域外部時,就創(chuàng)造了觀察閉包的條件

什么是閉包

在維基百科上對與閉包的理解是這樣的:閉包是引用了自由變量的函數(shù)。這個被引用的自由變量將和這個函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。
在JavaScript中,我們可以這樣理解:當(dāng)函數(shù)可以記住并訪問所在的詞法作用域,即使函數(shù)是在當(dāng)前的函數(shù)詞法作用域之外執(zhí)行,這是就產(chǎn)生了閉包

閉包的原理

要想理解閉包,首先要知道作用域的概念

理解作用域

作用域是根據(jù)名稱查找變量的一套規(guī)則,例如

var a = 2

這個聲明,會有兩個過程,首先編譯時,編譯器會在當(dāng)前作用于聲明這個變量(如果之前沒有聲明過的話),其次,引擎會詢問當(dāng)前作用域是否有a這個變量,如果是,則將2賦值給它,如果否,則繼續(xù)查找這個變量

作用域嵌套

當(dāng)一個塊或者一個函數(shù)嵌套在另一個塊或函數(shù)里,就產(chǎn)生了作用域嵌套,在當(dāng)前作用域查找不到變量時會在向上查找,就好比,一個高樓,我要去一個朋友家里,我要在第一層查找朋友家,但是如果沒找到,就要去上一層,如果到達了頂層還沒找到,我們就不會在繼續(xù)查找了。

理解閉包

我們之前說過當(dāng)函數(shù)可以記住并訪問所在的詞法作用域,即使函數(shù)是在當(dāng)前的函數(shù)詞法作用域之外執(zhí)行,這是就產(chǎn)生了閉包
看一下下面的代碼

    function foo(){
        var a = "dog";
        function bar(){
            console.log(a)
        }
        bar();
    }
    foo();

我們可以看到bar函數(shù)能夠訪問在foo函數(shù)里定義的a,但這只是閉包的一部分,bar對a的引用,可以看作是作用域的查找規(guī)則。則這些規(guī)則也是閉包的一部分。
那什么是真正的閉包的?

function foo(){
    var a = "dog";
    function bar(){
        console.log(a);
    }
    return bar
}
var baz = foo();
baz(); //dog

我們可以看到,bar函數(shù)可以訪問foo函數(shù)的作用域內(nèi)部,之后我們把bar本身當(dāng)作返回值賦值給baz,通過baz的調(diào)用來執(zhí)行bar函數(shù),實際上就是根據(jù)不同的標識符來調(diào)用bar函數(shù),達到在當(dāng)前詞法作用域外執(zhí)行的目的。
當(dāng)然無論以何種方式對函數(shù)類型的值進行傳遞,讓函數(shù)在別處也能被調(diào)用到

function foo(){
    var name = "dog";
    function bar(){
        console.log(name);
    }
    baz(bar);
}
function baz(fn){
    fn();
}
閉包能干什么

我們可以通過來實現(xiàn)模塊

function module(){
    var name = "dog";
    var age = 13;
    function SayName(){
        console.log(name);
    }
    function SayAge(){
        console.log(age);
    }
    return {
        SayName: SayName
        SayAge: SayAge
    }
}

var foo = module();
foo.SayName();  // dog
foo.SayAge(); // 13

這個模式在javascript中被稱為模塊
我們來分析一下這個代碼,module函數(shù)返回一個對象,這個返回的對象保存了對內(nèi)部函數(shù)而不是內(nèi)部變量的引用,我們保持對數(shù)據(jù)的隱私且私有的狀態(tài),可以將這個對象類型的返回值看作是一個公共API。這個返回的對象類型我們賦值給了foo,之后通過foo來調(diào)用這個API的屬性訪問。SayAge()和SayName()函數(shù)具有涵蓋模塊實例內(nèi)部作用域的閉包,當(dāng)通過返回一個含有屬性引用的對象方式來講函數(shù)傳遞到詞法作用域外部時,就創(chuàng)造了觀察閉包的條件

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84700.html

相關(guān)文章

  • 多層級理解閉包

    摘要:第二梯隊理解有了第一梯隊的認識,我們慢慢修正大腦中對閉包的認識。理解這句話就可以很好的與閉包這兩個字關(guān)聯(lián)起來理解閉包這個概念了??偨Y(jié)第二梯隊理解閉包是一個有特定功能的函數(shù)。第四梯隊理解閉包通過訪問外部變量,一個閉包可以維持這些變量。 閉包 閉包的概念困惑了我很久,記得當(dāng)時我面試的時候最后一面有一個問題就是問題關(guān)于閉包的問題,然而到現(xiàn)在已經(jīng)完全不記得當(dāng)時的題目是啥了,但仍然能夠回憶起當(dāng)時...

    nemo 評論0 收藏0
  • 理解 JavaScript 閉包

    摘要:如何在初學(xué)就理解閉包你需要接著讀下去。這樣定義閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合。小結(jié)閉包在中隨處可見。閉包是中的精華部分,理解它需要具備一定的作用域執(zhí)行棧的知識。 這是本系列的第 4 篇文章。 作為 JS 初學(xué)者,第一次接觸閉包的概念是因為寫出了類似下面的代碼: for (var i = 0; i < helpText.length; i++) { var item = he...

    寵來也 評論0 收藏0
  • 談?wù)勎宜?em>理解閉包,js、php、golang里closure

    摘要:當(dāng)初看這個解釋有點懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學(xué)習(xí)語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開始接觸編程是從js開始的,當(dāng)時網(wǎng)上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發(fā)現(xiàn)不光是js,php、...

    betacat 評論0 收藏0
  • 談?wù)勎宜?em>理解閉包,js、php、golang里closure

    摘要:當(dāng)初看這個解釋有點懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學(xué)習(xí)語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開始接觸編程是從js開始的,當(dāng)時網(wǎng)上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發(fā)現(xiàn)不光是js,php、...

    zhoutao 評論0 收藏0
  • 簡單理解JavaScript中閉包

    摘要:閉包在我理解是一種比較抽象的東西。所以我寫了一篇博文來方便自己理解閉包。那么現(xiàn)在我們可以解釋一下閉包的第一個定義在計算機科學(xué)中,閉包是引用了自由變量的函數(shù)。循環(huán)中創(chuàng)建閉包在我們使用的關(guān)鍵字之前,閉包的一個常見問題就出現(xiàn)在循環(huán)中創(chuàng)建閉包。 零. 前言 從我開始接觸前端時就聽說過閉包,但是一直不理解閉包究竟是什么。上網(wǎng)看了各種博客,大家對閉包的說法不一。閉包在我理解是一種比較抽象的東西。所...

    sihai 評論0 收藏0
  • 理解Javascript閉包

    摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會繼續(xù)存在。可惜的是,并沒有提供相關(guān)的成員和方法來訪問閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門文章。Javascript中有幾個非常重要的語言特性——對象、原型繼承、閉包。其中閉包 對于那些使用傳統(tǒng)靜態(tài)語言C/C++的程序員來說是一個新的語言特性。本文將...

    dayday_up 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<