摘要:什么是閉包在維基百科上對與閉包的理解是這樣的閉包是引用了自由變量的函數。則這些規則也是閉包的一部分。和函數具有涵蓋模塊實例內部作用域的閉包,當通過返回一個含有屬性引用的對象方式來講函數傳遞到詞法作用域外部時,就創造了觀察閉包的條件
什么是閉包
在維基百科上對與閉包的理解是這樣的:閉包是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。
在JavaScript中,我們可以這樣理解:當函數可以記住并訪問所在的詞法作用域,即使函數是在當前的函數詞法作用域之外執行,這是就產生了閉包
要想理解閉包,首先要知道作用域的概念
理解作用域作用域是根據名稱查找變量的一套規則,例如
var a = 2
這個聲明,會有兩個過程,首先編譯時,編譯器會在當前作用于聲明這個變量(如果之前沒有聲明過的話),其次,引擎會詢問當前作用域是否有a這個變量,如果是,則將2賦值給它,如果否,則繼續查找這個變量
作用域嵌套當一個塊或者一個函數嵌套在另一個塊或函數里,就產生了作用域嵌套,在當前作用域查找不到變量時會在向上查找,就好比,一個高樓,我要去一個朋友家里,我要在第一層查找朋友家,但是如果沒找到,就要去上一層,如果到達了頂層還沒找到,我們就不會在繼續查找了。
理解閉包我們之前說過當函數可以記住并訪問所在的詞法作用域,即使函數是在當前的函數詞法作用域之外執行,這是就產生了閉包
看一下下面的代碼
function foo(){ var a = "dog"; function bar(){ console.log(a) } bar(); } foo();
我們可以看到bar函數能夠訪問在foo函數里定義的a,但這只是閉包的一部分,bar對a的引用,可以看作是作用域的查找規則。則這些規則也是閉包的一部分。
那什么是真正的閉包的?
function foo(){ var a = "dog"; function bar(){ console.log(a); } return bar } var baz = foo(); baz(); //dog
我們可以看到,bar函數可以訪問foo函數的作用域內部,之后我們把bar本身當作返回值賦值給baz,通過baz的調用來執行bar函數,實際上就是根據不同的標識符來調用bar函數,達到在當前詞法作用域外執行的目的。
當然無論以何種方式對函數類型的值進行傳遞,讓函數在別處也能被調用到
function foo(){ var name = "dog"; function bar(){ console.log(name); } baz(bar); } function baz(fn){ fn(); }閉包能干什么
我們可以通過來實現模塊
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函數返回一個對象,這個返回的對象保存了對內部函數而不是內部變量的引用,我們保持對數據的隱私且私有的狀態,可以將這個對象類型的返回值看作是一個公共API。這個返回的對象類型我們賦值給了foo,之后通過foo來調用這個API的屬性訪問。SayAge()和SayName()函數具有涵蓋模塊實例內部作用域的閉包,當通過返回一個含有屬性引用的對象方式來講函數傳遞到詞法作用域外部時,就創造了觀察閉包的條件
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84700.html
摘要:如何在初學就理解閉包你需要接著讀下去。這樣定義閉包是函數和聲明該函數的詞法環境的組合。小結閉包在中隨處可見。閉包是中的精華部分,理解它需要具備一定的作用域執行棧的知識。 這是本系列的第 4 篇文章。 作為 JS 初學者,第一次接觸閉包的概念是因為寫出了類似下面的代碼: for (var i = 0; i < helpText.length; i++) { var item = he...
摘要:當初看這個解釋有點懵逼,理解成閉包就是函數中的函數了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數作為值返回的情況,被返回的函數引用了生成它的母函數中的變量。 本人開始接觸編程是從js開始的,當時網上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發現不光是js,php、...
摘要:當初看這個解釋有點懵逼,理解成閉包就是函數中的函數了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數作為值返回的情況,被返回的函數引用了生成它的母函數中的變量。 本人開始接觸編程是從js開始的,當時網上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發現不光是js,php、...
摘要:閉包在我理解是一種比較抽象的東西。所以我寫了一篇博文來方便自己理解閉包。那么現在我們可以解釋一下閉包的第一個定義在計算機科學中,閉包是引用了自由變量的函數。循環中創建閉包在我們使用的關鍵字之前,閉包的一個常見問題就出現在循環中創建閉包。 零. 前言 從我開始接觸前端時就聽說過閉包,但是一直不理解閉包究竟是什么。上網看了各種博客,大家對閉包的說法不一。閉包在我理解是一種比較抽象的東西。所...
摘要:但是閉包也不是什么復雜到不可理解的東西,簡而言之,閉包就是閉包就是函數的局部變量集合,只是這些局部變量在函數返回后會繼續存在??上У氖牵]有提供相關的成員和方法來訪問閉包中的局部變量。 (收藏自 技術狂) 前言:還是一篇入門文章。Javascript中有幾個非常重要的語言特性——對象、原型繼承、閉包。其中閉包 對于那些使用傳統靜態語言C/C++的程序員來說是一個新的語言特性。本文將...
閱讀 2298·2021-11-16 11:51
閱讀 3511·2021-09-26 10:14
閱讀 1840·2021-09-22 15:58
閱讀 1104·2019-08-30 15:52
閱讀 2020·2019-08-30 15:43
閱讀 2621·2019-08-30 13:46
閱讀 914·2019-08-30 13:10
閱讀 1026·2019-08-29 18:32