JS閉包是什麼?git
首先,放一個概念:github
函數 加 函數內部能訪問到的局部變量 就組成了一個閉包windows
那閉包又有什麼做用呢?閉包
閉包經常用來「間接訪問一個變量」。換句話說,「隱藏一個變量」。函數
一般作法是 暴露一個訪問器(函數),讓別人能夠「間接訪問」那個變量。spa
有這樣一段代碼:翻譯
var i = 'i am in windows' var test = function(){ var a = 0; var b = function(){ console.log(a) } return b }
很明顯 a 是 test 這個函數對象內的局部變量 而在其內部 b 又引用了這個對象a 這就是一個閉包code
a變量 和 b 函數對象組成了一個閉包對象
那爲何要test函數裏要再套一個b函數呢?blog
是由於須要局部變量,因此才把 a 放在一個函數裏,若是不把 a 放在一個函數裏,a 就是一個全局變量了,達不到使用閉包的目的——隱藏變量。
有些人看到「閉包」這個名字,就必定以爲要用什麼包起來才行。其實這是翻譯問題,閉包的原文是 Closure,跟「包」沒有任何關係。
因此函數套函數只是爲了造出一個局部變量,跟閉包無關。
那爲何又要 return b 呢?
由於若是不 return,你就沒法使用這個閉包。return b 的目的只是讓外面能夠訪問到這個 b 函數。
因此 return b 只是爲了 b 能被使用,也跟閉包無關。
下面看下 閉包的廬山真面目:
看到了嗎 function scope 裏面出現了Closure 和 Global
Closure裏有 a 變量的值 也就是 0
那麼咱們是否能夠猜想 咱們在首行定義的全局變量 i 是否是就在Global這個 function scope 裏面?
驗證下
全局變量 i 確實就在 Global裏面
其實,function scope內默認有個名爲 Globe 的全局引用(有了這個引用,就能夠直接調用 Globe 的屬性或方法)
而在Closure裏的變量或方法 外部是沒法直接訪問的
這就是 隱藏 了一個變量
by 潘小閒
參考資料:JS中的閉包是什麼