綜合知識

當前位置 /首頁/綜合知識 > /列表

js的閉包是什麼意思

js的閉包是什麼意思

js的閉包是什麼意思:答案是一個函數。

js的閉包是什麼意思:答案是一個函數。

在javascript中,閉包指的就是一個函數;當兩個函數彼此嵌套時,內部的函數就是閉包。典型的閉包體是一個嵌套結構的函數;內部函數引用外部函數的私有成員,同時內部函數又被外界引用,當外部函數被調用後,就形成了閉包。

閉包算沖末就是能夠讀取其他函數內部即普室倍電服告變量的函數。由來自於在javascript中,只有函數內部的子函數才能讀取局部變量,所以閉包可以理解成“定義徑數損出負幫抓放在一個函數內部的函數”。在本質上,閉包是將函數內部和函數海集雜頂歷品報外部連接起來的橋樑。

Ja來自vaScrip象團縣型定t閉包,在JavaScript中允許函數定義和函數表達式位於另一個函數的函數體中(內部函數),而且內部函數可以訪問它們所在外部函數聲明中的所有局部變量,參數以及其他內部函談低狀然數。當其中一個內部函數被外部函數以外調用時就會形成閉包。

其他相關內容推薦1

閉包就是能夠讀取其他函數內部變量的函數。由於在jav來自ascript中,只有函數內部的子函數才能讀取局部變量,所以閉包可以理解成“定義在一個函數內部的函數”。在本質上,閉包是將函數內部和函數外部連接起來的橋樑。

JavaScript閉包,在J來自avaScript中允許函數停統覺定義和函數表達式位於另一個函數的函數體中(內部函數),而且內部函數可以訪問它們所在外部函數聲明中的所有局殺基材環跳減部變量,參數以及其他內部函數。當其中一個內部函數被外部函數以外調用時就會形成閉包。

其他相關內容推薦2投稿:yangang

閉包就是能夠讀取其他函數內部變量的函數。由於在javascript中,只有函數內部的子函數才能讀取局部變量,所以閉包可以理解成“定義在一個函數內部的函數”。在本質上,閉包是將函數內部和函數外部連接起來的橋樑。

JavaScript閉包,在JavaScript中允許函數定義和函數表達式位於另一個函數的函數體中(內部函數),而且內部函數可以訪問它們所在外部函數聲明中的所有局部變量,參數以及其他內部函數。當其中一個內部函數被外部函數以外調用時就會形成閉包。

小編還為您整理了以下內容,可能對您也有幫助:

js閉包是什麼?

js閉包是一個擁有許多變量和綁定了這些變量的環境的表達式。

閉包的特點:

1、作為一個函數變量的一個引用,當函數返回時,其處於激活狀態,一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。

2、js閉包允許使用內部函數,這些內部函數可以訪問它們所在的外部函數中聲明的參數和聲明的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。

擴展資料:

js閉包實例:

1、函數內部可以直接讀取全局變量

<script type="text/javascript">

var n=100;

function parent(){

alert(n);

}

2、讀取函數內的局部變量

parent();//100

</script>

function parent(){

m=50;

}

parent();

alert(m);//50

參考資料來源:百度百科:javascript閉包

js中閉包指的是?

閉包是指有權訪問另外一個函數作用域中的變量的函數。

閉包就是函數的局部變量集合,只是這些局部變量在函數返回後會繼續存在。閉包就是就是函數的“堆疊”在函數返回後並不釋放,我們也可以理解為這些函數堆疊並不在棧上分配而是在堆上分配。當在一個函數內定義另外一個函數就會產生閉包。

作用是:匿名自執行函數:我們知道所有的變量,如果不加上var關鍵字,則默認的會添加到全局對象的屬性上去,這樣的臨時變量加入全局對象有很多壞處,如:別的函數可能誤用這些變量;造成全局對象過於龐大,影響訪問速度(因為變量的取值是需要從原型鏈上遍歷的)。除了每次使用變量都是用var關鍵字外,我們在實際情況下經常遇到這樣一種情況,即有的函數只需要執行一次,其內部變量無需維護,可以用閉包。

結果緩存:我們開發中會碰到很多情況,設想我們有一個處理過程很耗時的函數對象,每次調用都會花費很長時間,那麼我們就需要將計算出來的值存儲起來,當調用這個函數的時候,首先在緩存中查找,如果找不到,則進行計算,然後更新緩存並返回值,如果找到了,直接返回查找到的值即可。閉包正是可以做到這一點,因為它不會釋放外部的引用,從而函數內部的值可以得以保留。

什麼是JS閉包?求詳解

閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。

閉包是一個比較抽象的概念,尤其是對js新手來説.書上的解釋實在是比較晦澀,對我來説也是一樣.

但是他也是js能力提升中無法繞過的一環,幾乎每次面試必問的問題,因為在回答的時候.你的答案的深度,對術語的理解以及js內部解釋器的運作方式的描述,都是可以看出你js實際水平的.即使你沒答對,也能讓考官對你的水平有個評估.那麼我先來説説我對js中的閉包的理解.

閉包是很多語言都具備的特性,在js中,閉包主要涉及到js的幾個其他的特性:作用域鏈,垃圾(內存)回收機制,函數嵌套,等等.

在理解閉包以前.最好能先理解一下作用域鏈的含義,簡單來説,作用域鏈就是函數在定義的時候創建的,用於尋找使用到的變量的值的一個索引,而他內部的規則是,把函數自身的本地變量放在最前面,把自身的父級函數中的變量放在其次,把再高一級函數中的變量放在更後面,以此類推直至全局對象為止.當函數中需要查詢一個變量的值的時候,js解釋器會去作用域鏈去查找,從最前面的本地變量中先找,如果沒有找到對應的變量,則到下一級的鏈上找,一旦找到了變量,則不再繼續.如果找到最後也沒找到需要的變量,則解釋器返回undefined.

瞭解了作用域鏈,我們再來看看js的內存回收機制,一般來説,一個函數在執行開始的時候,會給其中定義的變量劃分內存空間保存,以備後面的語句所用,等到函數執行完畢返回了,這些變量就被認為是無用的了.對應的內存空間也就被回收了.下次再執行此函數的時候,所有的變量又回到最初的狀態,重新賦值使用.但是如果這個函數內部又嵌套了另一個函數,而這個函數是有可能在外部被調用到的.並且這個內部函數又使用了外部函數的某些變量的話.這種內存回收機制就會出現問題.如果在外部函數返回後,又直接調用了內部函數,那麼內部函數就無法讀取到他所需要的外部函數中變量的值了.所以js解釋器在遇到函數定義的時候,會自動把函數和他可能使用的變量(包括本地變量和父級和祖先級函數的變量(自由變量))一起保存起來.也就是構建一個閉包,這些變量將不會被內存回收器所回收,只有當內部的函數不可能被調用以後(例如被刪除了,或者沒有了指針),才會銷燬這個閉包,而沒有任何一個閉包引用的變量才會被下一次內存回收啟動時所回收.追問還不是很懂😌

追答1、閉包就是能夠讀取其他函數內部變量的函數。由於在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋樑。

2、使用閉包的注意點

1)由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。

2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

js閉包的理解

閉包是js中的一個特點也是一個知識難點,在定義一個全局變量的時候,如果在不知道前面的代碼的情況下,不小心定義了同一個變量名,則前面的代碼運行結果會受到影響,為了避免這種影響,於是就有了閉包。

閉包可以解決全局變量污染的問題,特點是在一個函數中聲明變量(此時的變量是局部變量,不影響全局變量),同時在該函數中再定義一些函數,閉包的特點就是函數套函數:在閉包中聲明變量,裏面的值不會受到函數外的同名變量影響,但閉包的缺點是內存泄漏。

程序在申請內存後,無法釋放已申請的內存空間,一次內存泄漏似乎不會有大的影響,但內存泄漏堆積後的後果就是內存溢出(內存不夠用)。

函數只有在調用時會發揮作用,不調用是會被釋放內存的;但是看到上面的閉包函數作為一個值給了一個全局變量,這種情況下是清不掉的,這就造成內存泄露。

這樣的閉包函數多了,最後的結果就是內存溢出。

js中閉包是什麼意思,有什麼作用,最好舉例説明啊。

函數對象可以通過作用域鏈相互關聯起來,函數體內部的變量都可以保存在函數作用域內,這種特性在計算機科學文獻中稱之為“閉包”。

從技術角度講,所有的JavaScript函數都是閉包: 它們都是對象,它們都關聯到作用域鏈。

實現計數器

介紹利用閉包實現計數器,請看以下代碼:

var counter = (function() {

var count = 0;

return function() {

return count ++;

}

})();

以上代碼定義了一個立即執行的函數,count遍歷只能在這個匿名函數中可以使用。

JS閉包的概念

先從閉包特點解釋,應該更好理解.

閉包的兩個特點:

1、作為一個函數變量的一個引用 - 當函數返回時,其處於激活狀態。

2、一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。

其實上面兩點可以合成一點,就是閉包函數返回時,該函數內部變量處於激活狀態,函數所在棧區依然保留.

我們所熟知的主流語言,像C,java等,在函數內部只要執行了return,函數就會返回結果,然後內存中刪除該函數所在的區域.生命週期也就停止了.一般的js函數也是這樣.

但是有閉包特性的js函數有點特殊.

就例子來説:

function a(){

var i=0;

function b(){

alert(++i);

}

return b;

}

var c = a();

c();

這是個標準的閉包.在函數a中定義了函數b,a又return了b的值.這些可以先不管.

var c = a();

c();

這兩句執行很重要.

在var c = a();這行裏,執行了a函數,那麼肯定a經過了return.按照主流語言的函數特性,現在c的值就是a的返回值.

第二行c()的執行實際執行的就是b函數.最後不管執行的是誰,會彈出一個值為0的窗口,到此為止,所有的生命週期按理論來説就算全部結束了.

可是,如果我們再多執行一行.

var c = a();

c();

c();

第一次彈出0,第二次執行卻彈出了1.

也就是説,第一次c()後,a中的i依然保留.自然a在內存的棧區依然保留.

a是return過了,但是,a及內部值卻依然存在,這就是閉包.

好了,總結下,

1,閉包外層是個函數.

2,閉包內部都有函數.

3,閉包會return內部函數.

4,閉包返回的函數內部不能有return.(因為這樣就真的結束了)

5,執行閉包後,閉包內部變量會存在,而閉包內部函數的內部變量不會存在.

閉包的應用場景(呵呵,複製的參考資料)

1、保護函數內的變量安全。以最開始的例子為例,函數a中i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。

2、在內存中維持一個變量。依然如前例,由於閉包,函數a中i的一直存在於內存中,因此每次執行c(),都會給i自加1。

根據參考資料的應用場景,我們會自然的想到java或是c++的類.雖然JS沒有類的概念,但是有了類的相似執行結果.

另外,還有一種格式頗受爭議:

(function(a,b))(a,b);

如果你使用過jquery,並且觀察過他的代碼,你就會很奇怪他的寫法,網上有人也把這種格式叫做閉包.

javascript的閉包是什麼意思 有什麼用

一、什麼是閉包?

“官方”的解釋是:所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。

相信很少有人能直接看懂這句話,因為他描述的太學術。我想用如何在Javascript中創建一個閉包來告訴你什麼是閉包,因為跳過閉包的創建過程直接理解閉包的定義是非常困難的。看下面這段代碼:

function a(){

var i=0;

function b(){

alert(++i);

}

return b;

}

var c = a();

c();

這段代碼有兩個特點:

1、函數b嵌套在函數a內部;

2、函數a返回函數b。

這樣在執行完var c=a()後,變量c實際上是指向了函數b,再執行c()後就會彈出一個窗口顯示i的值(第一次為1)。這段代碼其實就創建了一個閉包,為什麼?因為函數a外的變量c引用了函數a內的函數b,就是説:

當函數a的內部函數b被函數a外的一個變量引用的時候,就創建了一個閉包。

我猜想你一定還是不理解閉包,因為你不知道閉包有什麼作用,下面讓我們繼續探索。

二、閉包有什麼作用?

簡而言之,閉包的作用就是在a執行完並返回後,閉包使得Javascript的垃圾回收機制GC不會收回a所佔用的資源,因為a的內部函數b的執行需要依賴a中的變量。這是對閉包作用的非常直白的描述,不專業也不嚴謹,但大概意思就是這樣,理解閉包需要循序漸進的過程。

在上面的例子中,由於閉包的存在使得函數a返回後,a中的i始終存在,這樣每次執行c(),i都是自加1後alert出i的值。

那 麼我們來想象另一種情況,如果a返回的不是函數b,情況就完全不同了。因為a執行完後,b沒有被返回給a的外界,只是被a所引用,而此時a也只會被b引 用,因此函數a和b互相引用但又不被外界打擾(被外界引用),函數a和b就會被GC回收。(關於Javascript的垃圾回收機制將在後面詳細介紹)

三、閉包內的微觀世界

如 果要更加深入的瞭解閉包以及函數a和嵌套函數b的關係,我們需要引入另外幾個概念:函數的執行環境(excution context)、活動對象(call object)、作用域(scope)、作用域鏈(scope chain)。以函數a從定義到執行的過程為例闡述這幾個概念。

1、當定義函數a的時候,js解釋器會將函數a的作用域鏈(scope chain)設置為定義a時a所在的“環境”,如果a是一個全局函數,則scope chain中只有window對象。

2、當函數a執行的時候,a會進入相應的執行環境(excution context)。

3、在創建執行環境的過程中,首先會為a添加一個scope屬性,即a的作用域,其值就為第1步中的scope chain。即a.scope=a的作用域鏈。

4、然後執行環境會創建一個活動對象(call object)。活動對象也是一個擁有屬性的對象,但它不具有原型而且不能通過JavaScript代碼直接訪問。創建完活動對象後,把活動對象添加到a的作用域鏈的最頂端。此時a的作用域鏈包含了兩個對象:a的活動對象和window對象。

5、下一步是在活動對象上添加一個arguments屬性,它保存着調用函數a時所傳遞的參數。

6、最後把所有函數a的形參和內部的函數b的引用也添加到a的活動對象上。在這一步中,完成了函數b的的定義,因此如同第3步,函數b的作用域鏈被設置為b所被定義的環境,即a的作用域。

到此,整個函數a從定義到執行的步驟就完成了。此時a返回函數b的引用給c,又函數b的作用域鏈包含了對函數a的活動對象的引用,也就是説b可以訪問到a中定義的所有變量和函數。函數b被c引用,函數b又依賴函數a,因此函數a在返回後不會被GC回收。

當函數b執行的時候亦會像以上步驟一樣。因此,執行時b的作用域鏈包含了3個對象:b的活動對象、a的活動對象和window對象,如下圖所示:

如圖所示,當在函數b中訪問一個變量的時候,搜索順序是先搜索自身的活動對象,如果存在則返回,如果不存在將繼續搜索函數a的活動對象,依 次查找,直到找到為止。如果整個作用域鏈上都無法找到,則返回undefined。如果函數b存在prototype原型對象,則在查找完自身的活動對象 後先查找自身的原型對象,再繼續查找。這就是Javascript中的變量查找機制。

四、閉包的應用場景

1、保護函數內的變量安全。以最開始的例子為例,函數a中i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。

2、在內存中維持一個變量。依然如前例,由於閉包,函數a中i的一直存在於內存中,因此每次執行c(),都會給i自加1。

以上兩點是閉包最基本的應用場景,很多經典案例都源於此。

五、Javascript的垃圾回收機制

在Javascript中,如果一個對象不再被引用,那麼這個對象就會被GC回收。如果兩個對象互相引用,而不再被第3者所引用,那麼這兩個互相引用的對象也會被回收。因為函數a被b引用,b又被a外的c引用,這就是為什麼函數a執行後不會被回收的原因。

參考資料:http://softbbs.pconline.com.cn/9497825.html

js 閉包原理

1、閉包的概念:指有權訪問另一個函數作用域中的變量的函數,一般情況就是在一個函數中包含另一個函數。

2、閉包的作用:訪問函數內部變量、保持函數在環境中一直存在,不會被垃圾回收機制處理

因為函數內部聲明 的變量是局部的,只能在函數內部訪問到,但是函數外部的變量是對函數內部可見的,這就是作用域鏈的特點了。

子級可以向父級查找變量,逐級查找,找到為止

因此我們可以在函數內部再創建一個函數,這樣對內部的函數來説,外層函數的變量都是可見的,然後我們就可以訪問到他的變量了。

3、閉包的優點:

方便調用上下文中聲明的局部變量

邏輯緊密,可以在一個函數中再創建個函數,避免了傳參的問題

4、閉包的缺點:

因為使用閉包,可以使函數在執行完後不被銷燬,保留在內存中,如果大量使用閉包就會造成內存泄露,內存消耗很大

js什麼是閉包

js閉包解析

JS閉包的真正意義?

js閉包是是實現函數外訪問函數內的私有變量和方法。

閉包的概念:是指有權訪問另一個函數作用域中的變量的函數。創建閉包常見的方法就是在一個函數內部創建一個內部私有函數。

簡單的閉包實例:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>閉包1</title>

<script type="text/javascript">

function test(){

var x=10;

return function(){

return x;

}

}

var a=test();//此時test()函數的返回值是一個函數,即返回值為函數的函數。

alert(a());//此時在a後加()即為執行那個匿名函數,實現了函數內部訪問內部變量

</script>

</head>

<body>

</body>

</html>

TAG標籤:閉包 js #