在JavaScript中,閉包對於JavaScript的意義無異於指針在c++中的意義。理解閉包是咱們掌握JavaScript這門語言的基礎能力,而對閉包的掌握程度就能夠看出來你對JavaScript這門語言的深刻程度,網上關於閉包的文章也很多但多數讓人看過以後一頭霧水,也許是本身理解能力較差。因此我還下定決心以提問的方式來理解何謂閉包,但願能給與我有相同境遇的博友一點幫助。javascript
1. 爲何函數內部能夠引用外部的參數和變量?前端
2. 爲何參數和變量不會被垃圾回收機制回收?vue
var a = 20;
function clour(c) {
var b = a + c;
function innerTest() {
return b + c;
}
return innerTest();
}
var result =clour();//全局變量result不會被回收,而且innerTest被其引用也不會被回收
複製代碼
以上就是爲什麼閉包是能保存變量不被回收。由於閉包內部的變量被一直引用着,JavaScript的垃圾回收機制決定了這種狀況不會被回收的。
;(function(global, factory) {
factory(global);
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) {
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {};
//......
if ( typeof noGlobal === strundefined ) {
window.jQuery = window.$ = jQuery;
}
return jQuery;
}));
複製代碼
看到這段代碼你們是否是覺的很熟悉,相信只要是前端都用過他jquery,可是有幾人仔細研究過jquery的源碼呢(反正我沒有=-=)。細節咱們就很少說了,這種總體架構咱們瞅瞅就曉得用了閉包。這也是前端模塊化很是成功的一個實例,雖然如今已經漸漸退出前端界,可是如今比較火的vue(reactjs源碼沒看過不肯定是否也使用了這種結構)中,模塊化很常見。java
setTimeout(function(){
console.log('this is time out')
},1000)
複製代碼
// 正常函數
function normal(a, b) {
return x + y
}
// 柯里化函數
function curry(x) {
return function (y) {
return x + y
}
}
normal(2, 2) // 4
curry(21)(2) // 4
複製代碼
函數能夠做爲參數進行傳遞,而且將函數做爲返回值return出去。react
道可道很是道。名可名很是名。在javascript語言世界中有許多特性須要咱們本身去理解,別人告訴你的是他們站在本身的角度思考得出的結論,這點咱們只能做爲參考來看,這也是我爲什麼要寫這篇文章,不僅是爲了給別人分享下本身對JavaScript閉包的理解也是本身對閉包這塊的一個總結吧,若有不正之處請文明指正。jquery
注:本文參考的文檔前端基礎進階(四):詳細圖解做用域鏈與閉包做者前端基礎進階系列文章通俗易懂值得一讀。c++