JavaScript 裡的閉包是什麼?應用場景有哪些?

時間 2021-05-29 23:01:39

1樓:華胥入夢

簡單來說,閉包是乙個函式。

乙個作用域可以訪問另外乙個函式的區域性變數,就會產生閉包,這個被訪問變數所在的函式即是閉包函式。

閉包的主要作用就是延伸了變數的作用域。常見的立即執行函式就是乙個閉包函式,因為其內部的所有函式都能訪問它傳遞的引數。

通過例項徹底理解閉包_青衫客的部落格-CSDN部落格

2樓:spacedong

本質的一句話:閉包是函式內部的乙個函式。首先我們先定義乙個f1函式,如下:

function

f1(),f3

:function(),

}}varresult=f1

();console

.log

(result.f2

());

// 1

console

.log

(result.f3

());

// 2

console

.log

(result.f2

());

// 2

這裡,f2和f3都屬於閉包。可以通過f2來獲取到這個函式中的foo變數。也可以通過f3來改變foo的變數。

閉包的作用就是:

1、可以建立出公共的方法來訪問或者改變函式中私有的變數,等於是getter或者是setter方法。

2、可以讓這些變數一直在記憶體中儲存(如果使用不當,容易造成記憶體洩漏)

3樓:

在乙個封閉的詞法作用域內,乙個函式對此作用域內的變數進行了引用,此函式或此函式與其引用的變數形成的作用域環境叫做閉包。

應用大概是模擬私有變數和模組應用。

4樓:

// 這是佩奇

varPeppa=(

function(),

getCard

:function();

}}})();

// 佩奇會寫自己的名字

Peppa

.writeName

();// > 你好我是佩奇

// 你可以看佩奇的名片

varcard

=Peppa

.getCard

();// >

// 但是你不知道佩奇現在的想法

Peppa

.idea

;// > undefined

// 你可以嘲笑佩奇是豬

Peppa

.name

='豬'

;// 但佩奇不會說自己是豬

Peppa

.writeName

();// > 你好我是佩奇

5樓:千鋒教育

JS中的閉包是每乙個前端人都要面對的乙個攔路虎,閉包看上去不好理解其實也好理解。首先我們要弄明白的就是建立乙個閉包可以幫我們做哪些事情,然後怎麼去建立乙個閉包,在什麼場景下使用閉包。

首先需要闡明的就是,閉包會把一些變數值永久的儲存在記憶體中,這些變數不會隨著函式的執行結束而銷毀掉。我們可以通過閉包去訪問這些函式內部變數的值,這也是閉包的特點。

那怎麼去建立乙個閉包呢?我們可以在乙個函式a內部返回另外乙個函式b,這樣就可以在函式b中去訪問修改函式a內部宣告的變數。函式a和函式b這兩個函式就形成了乙個閉包。

函式a中的變數不會隨著a執行完而銷毀掉。

說到閉包的使用場景,在JS的世界內,閉包無處不在。只是我們沒有注意到罷了。如果我們想要訪問乙個函式內部的變數,這個時候就需要使用到閉包。

下面是一道閉包的練習題,如果推測的結果和執行的結果一致,則說明你對閉包已經掌握了。Good Luck!

【Web前端開發學習交流】

6樓:VinCoder

7樓:凱斯

當你將乙個好書作為引數傳遞到另乙個函式或者在乙個函式內部return乙個函式時,閉包就建立了

閉包可以運用於高階函式或者是函式柯里化等場景但是要注意,因為閉包保留當前詞法作用域的引用而閉包是函式函式又是物件因此在不使用閉包的時候要清除,避免記憶體洩漏。就好像使用了定時器就要記得清除定時器,同樣的道理啦 :)

8樓:

你媽給你馬鈴薯,油鍋或者給你成品薯條然後把你鎖房間裡,當然給你用電腦不斷WIFI,你自己吃薯條自己活著。

但是你突然想吃金拱門,不行你出不去,雖然都是吃薯條。

9樓:

乙個函式作用域裡面可以使用全域性作用域的變數,但是全域性作用域想要訪問函式作用域的變數正常情況是不行的。那麼最容易想到的就是直接返回函式作用域中需要的值。還就一種就是在函式作用域中再定義個函式,然後這個函式訪問外部函式中需要的變數,外函式返回內函式,這就是個閉包...

...紅寶書中這個說的「 是指有權訪問另乙個函式作用域中變數的函式」。值得注意的是,第一種情況下,函式返回後,引用計數歸零了,它的活動物件就消失了。

但是後者因為返回的是個函式,這個函式又訪問了外函式的變數,所以這時候外函式的活動物件並不會消失,因為引用計數並沒有清零。這時候內函式可以通過作用域鏈訪問到外函式中的變數。但是注意此時外函式已經執行完成,只是活動物件還在,所以如果外函式變數是可變的,內函式只能訪問到他最後的那個狀態(比如迴圈繫結的經典例子,外函式有個for迴圈,上面有人提到過)

10樓:李友傑

閉包就是儲存它定義位置時候的作用域鏈,在呼叫位置可以隨意取出定義位置時候的作用域鏈上的變數物件。

簡單來說,閉包就是儲存了定義時候的變數。

場景如下:

1.在遞迴做計算的時候非常有用,儲存內部變數在記憶體之中2.當外部需要訪問內部函式的變數

3.私有變數和模組化

11樓:甘洪翔

說個應用場景。

利用閉包可以給物件設定私有屬性並利用特權(Privileged)方法訪問私有屬性。

var Foo = functionvar name = 'fooname';

var age = 12;

this.getName = functionreturn namethis.getAge = functionreturn agevar foo = new Foo();

foo.namegt; undefinedfoo.agegt; undefined

foo.getNamegt; 'fooname'

foo.getAgegt; 12

12樓:

上面的童鞋們都答了不少,個人覺得認識閉包,首要是要徹底理解JS中的變數作用域以及this,閉包只是一種特殊作用域下面的變數傳遞規則而已。

13樓:ly你個c

Closure太簡單了。只需要知道anonymous function,execution context,scope chain。

anonymous function就是function expression。

每次進入乙個function,都會隨之進入乙個execution context(EC)。EC有2個phases。1st phase會建立乙個activation Object(AO),AO會收集並儲存這個EC內的所有function declaration, formal parameter, variable declaration。

scope chain儲存的是當前AO及其外部(直到global)的AO。

綜上,closure就是乙個函式a可以訪問函式A的變數

這不是廢話嗎?當a巢狀在A裡,當然可以啦。但是,當函式A執行結束後,我們都知道A的scope chain 和 variables等都會被銷毀。那麼a還可以呼叫A裡的這些東西嗎?

答案當然是肯定的,因為a的scope chain裡儲存了A的AO,直到a被呼叫結束,或者把null賦值給他。

When using closure:

Closure可以模仿block scoping。

Closure可以在物件中建立public method來訪問物件中的private variables。

14樓:馮東

閉包的正確稱謂是 first-class function with lexical scope。

First-class function 決定了函式可以在另乙個函式內部被定義,並且作為 return value 返回。

Lexcial scope 指:當乙個名稱不是引數也不是區域性變數的時候,VM 會從該函式定義的函式執行時的區域性變數中繫結。如果仍然沒有再向上類推(最終所有函式都是在 global chunk 執行時被定義,所以最後都會從 global 變數中繫結)。

Structure and Interpretation of Computer Programming 的第三章的 environment model 是對閉包最精確的描述。每個函式被定義時有乙個 bound environment,每個函式每次被呼叫時有乙個 created environment。乙個函式定義時的 bound environment 是這個函式的外層函式被呼叫時的 created environment。

區域性變數在 created environment 中,閉包變數在 bound environment 中。

15樓:kuby

閉包是窮人的物件,物件是窮人的閉包.

16樓:

閉包就是由函式創造的乙個詞法作用域,裡面建立的變數被引用後,可以在這個詞法環境之外自由使用。( https://

secure.wikimedia.org/wikipedia/zh/w/index.

php?title=%E9%97%AD%E5%8C%85_%28%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6%29&variant=zh-cn

)閉包通常用來建立內部變數,使得這些變數不能被外部隨意修改,同時又可以通過指定的函式介面來操作。

JavaScript 迴圈新增事件時閉包的影響有哪些解法?

這跟JS函式的傳參方式和事件的賦值方式有關。1 JS函式傳參是傳值不傳址的。2 onclick的值應該給乙個函式宣告,事件觸發時只會傳乙個event引數給宣告的函式。如果在迴圈中使用alink i onclick function i 不是這個匿名函式的引數,是傳址進去的,當onclick事件觸發的...

JavaScript 中,有無可能為閉包隔絕外部所有變數,令閉包內視同一切識別符號皆未定義?

賀師俊 既然叫閉包,就必然有自由變數,而自由變數之resolve,自然是從外層來。當然JS也有些改變一般resolve策略的方式,比如套個with之類的。不過with statement需要預先包好,且即使如此,也無法全然隔離,特別是由於JS最初的設計問題,總是最終會掉到global上。另外可考慮的...

如何證明閉包是閉集合?

看其它答案說了很多,但沒有啥證明 1 若定義 集合A的閉包為包含A的最小閉集,那自然不需要證明.2 度量空間X,有集合E含於X,那麼定義 E的閉包為E和E的導集的並集,證明E的閉包為閉集.E的導集就是由E在X中所有的極限點組成的集合 let p屬於X,且不屬於E的閉包.由於p不屬於E的閉包 p顯然不...