在javascript中閉包的定義很抽象,在一些剛?cè)肟拥男率盅劾锿耆荒芾斫忾]包到底是什么東西。
在介紹閉包前需要先了解變量的作用域赖临,什么是變量的作用域呢?
一:作用域
變量的作用域無非分為兩種:全局變量和局部變量灾锯;
全局變量的聲明方式:
三種聲明全局變量的方式
局部變量聲明方式:
肯定會有小伙伴問到為什么同樣是var 聲明的變量兢榨,為什么這個變量是局部變量。想要了解為什么顺饮,下篇文章我會說清楚的吵聪。到底和閉包有什么關系呢,直接上代碼講解兼雄。
閉包:
下面我來分析一下吟逝,函數(shù)f1中聲明了一個局部變量n并給其賦值999,同時f1當中還包含了個函數(shù)f2,
函數(shù)f2中放入了一個彈框赦肋。
針對本例子解釋下來就是块攒,f1中的變量f2是可見的。反之f1卻看不到f2中的變量金砍,子對象可以看到父對象中的變量局蚀。那么把f2返回出去不就可以看到函數(shù)內(nèi)部的變量了嘛?
我對閉包對的理解就是 ”閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)“恕稠,
是不是感覺閉包很厲害的樣子琅绅,還有更厲害的,閉包可以使變量存儲在內(nèi)存中鹅巍。
凡事有利就有弊千扶,說一下閉包的缺點:
(1)由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大骆捧,所以不能濫用閉包澎羞,否則會造成網(wǎng)頁的性能問題,在IE中可能導致內(nèi)存泄露敛苇。解決方法是妆绞,在退出函數(shù)之前,將不使用的局部變量全部刪除枫攀。
(2)閉包會在父函數(shù)外部括饶,改變父函數(shù)內(nèi)部變量的值。所以来涨,如果你把父函數(shù)當作對象 ? 使用图焰,把閉包當作它的公用方法,把內(nèi)部變量當作它的私有屬性(private value)蹦掐,這時一定要小心技羔,不要隨便改變父函數(shù)內(nèi)部變量的值僵闯。
還是勸各位慎重使用閉包。