閉包

閉包是定義在一個函數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容