JS閉包學習筆記
JavaScript中的閉包,相信學前端的小夥伴都很熟悉這個詞,但是被問及什麼是閉包,卻隻能回答上來一點概念相關,是以今天寫一篇學習日整理一些在網上所學習到的有關閉包的知識。
1.什麼是閉包
首先,我們需要了解js中的變量分為全局變量和局部變量。一個函數内部可以通路到函數内定義的變量(即局部變量)和全局變量,但是外部不能通路到函數内部的變量,當函數内部嵌套了函數時,裡面的函數也是可以通路到外部函數定義的變量的,這就是了解閉包的前提知識之一。那麼,到底什麼是閉包呢?看了各種關于閉包的概念都比較抽象,也是各不盡相同的。但是,閉包都會有有以下兩個概念:
- 函數嵌套函數;
-
内部函數可以通路到外部函數的變量;
在知乎‘「每日一題」JS 中的閉包是什麼?’中一個高贊回答提到這樣一個概念:
「函數」和「函數内部能通路到的變量」(也叫環境)的總和,就是一個閉包。
用自己的話總結一下,就是
一個函數内部嵌套一個函數,子函數可以通路到外部函數中的變量和參數,這樣的一整個函數就是一個閉包。
至此,面試問道的閉包的概念到這就差不多了。這就是一個簡單的閉包:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
2.閉包的作用是什麼
那麼閉包在我們的開發環境中有什麼作用呢?我們在什麼時候會需要用到閉包呢?
我們都知道,在一般情況下,我們調用完函數之後,在他裡面的變量是會被立即回收的。但是在一個閉包裡面,因為該變量還被函數裡面的函數引用着,是以并不會被銷毀。
此外,全局變量相較于函數内部的變量。全局變量是大家都可以調用的,是以很容易發生改變;但是函數内部的變量在外部是通路不到的,我們隻能通過閉包裡面的函數來調用這個變量,并且剛才有提到到這個變量是不會銷毀的,我們下次還可以繼續調用。
這樣,我們可以大緻地總結出閉包地作用:
當我們希望一個變量隻能通過某一個函數調用才更改,并且希望這個變量儲存着的時候,我們就可以使用閉包。
同理,因為這個變量是我們希望它儲存着的,是以
閉包并不會引起記憶體洩露
這就是關于閉包的一些學習筆記,面試的時候閉包通常會問的三個問題:
什麼是閉包?閉包有什麼作用?閉包會不會引起記憶體洩漏?
現在都有了一定的了解。後續有新的内容會繼續改進哦!