閉包是定義在一個函數(shù)內(nèi)部可訪問該函數(shù)內(nèi)部局部變量的函數(shù),作用就是讓函數(shù)外部可以訪問函數(shù)內(nèi)部局部變量。
舉個栗子:

假設(shè)以上代碼在一個立即執(zhí)行函數(shù)中。函數(shù)fo里面可以訪問到函數(shù)外部的a變量,這就是閉包。也就是:
「函數(shù)」和「函數(shù)內(nèi)部能訪問到的變量」(也叫環(huán)境)的總和,就是一個閉包。
有人說,閉包是需要函數(shù)套函數(shù),然后 return 一個函數(shù)的。
function foo(){
??var? a= 1
??function bar(){
? ? a++
????return a
??}
??return bar
}
var func = foo()
func()
local 變量和 bar 函數(shù)就組成了一個閉包(Closure)。
為什么要嵌套?因為需要局部變量,所以才把a放在一個函數(shù)里,如果不這樣,a就是一個全局變量了,達不到閉包的目的-隱藏變量。
為什么要return?bar?如果不return,就無法使用這個閉包。把 return bar 改成 window.bar = bar 也是一樣的,只要讓外面可以訪問到這個 bar 函數(shù)就行了。所以 return bar 只是為了 bar 能被使用,也跟閉包無關(guān)。
閉包的作用:常常用來「間接訪問一個變量」。換句話說,「隱藏一個變量」。若直接使用一個全局變量,有安全性問題。用局部變量,但外部有訪問不到,咋辦?暴露一個訪問器(函數(shù)),讓別人“間接訪問”。函數(shù)加變量構(gòu)成一個閉包。
閉包是JS函數(shù)作用域的副產(chǎn)品。正是由于 JS 的函數(shù)內(nèi)部可以使用函數(shù)外部的變量,所以這段代碼正好符合了閉包的定義。而不是 JS 故意要使用閉包。很多編程語言也支持閉包,另外有一些語言則不支持閉包。
閉包的謠言,有人說,閉包不是造成內(nèi)存泄露的根本原因,內(nèi)存泄露是指你用不到(訪問不到)的變量,依然占居著內(nèi)存空間,不能被再次利用起來。閉包里面的變量明明就是我們需要的變量,憑什么說是內(nèi)存泄露?謠言來自?IE。IE 有 bug,IE 在我們使用完閉包之后,依然回收不了閉包里面引用的變量。
參考鏈接:https://zhuanlan.zhihu.com/p/22486908