閉包算是前端面試的基礎(chǔ)題,但我看了很多關(guān)于閉包的文章博客,但感覺(jué)很多對(duì)于閉包的理想還是有分歧的,現(xiàn)在網(wǎng)上對(duì)閉包的理解一般是兩種:
- 有些文章認(rèn)為閉包必須要返回嵌套函數(shù)中里面用到外面函數(shù)局部變量的方法才叫閉包,有兩個(gè)條件:1)、函數(shù)嵌套,內(nèi)部函數(shù)要用到外部函數(shù)的局部變量 2)、內(nèi)部函數(shù)必須返回
- 有些文章認(rèn)為只要函數(shù)嵌套內(nèi)部函數(shù)用到了外部局部變量就是閉包,不要返回內(nèi)部函數(shù)
我們先看看閉包的定義到底是什么,然后在來(lái)分析我在學(xué)習(xí)js的時(shí)候不同階段對(duì)閉包的誤解。在高級(jí)程序設(shè)計(jì)中對(duì)閉包定義是這樣的:“閉包是指有權(quán)限訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)?!斑@里沒(méi)有提到這個(gè)函數(shù)必須要return出來(lái),我們?cè)诳纯凑Z(yǔ)言精粹中對(duì)閉包的定義是用一段很誤導(dǎo)人的代碼例子來(lái)解釋閉包:
var quo=function(status){ return{ get_status:function(){ return status; } } } var myQuo=quo("amazed"); document.writeln(myQuo.get_status());
"即使quo返回了,但get_status方法仍然享有訪問(wèn)quo對(duì)象的status屬性的特權(quán),get_status方法并不是訪問(wèn)該參數(shù)的一個(gè)副本,它訪問(wèn)的是該參數(shù)本身,只是可能的,因?yàn)樵?