千鋒教育JavaScript全套視頻教程(10天學(xué)會Js,前端javascrip

閉包
? ? ? ? // 函數(shù)在定義階段會產(chǎn)生一個存儲空間,并把存儲空間的地址給函數(shù)名,在調(diào)用的時候會開辟一個執(zhí)行空間(每次調(diào)用都不一樣),在執(zhí)行過后就會銷毀
? ? ? ? // 所以在函數(shù)內(nèi)部的變量在外部拿不到(銷毀了)
? ? ? ? // ?不讓執(zhí)行空間銷毀 ===
? ? ? ? // 每一個函數(shù)會有一個存儲空間, 執(zhí)行空間會在函數(shù)執(zhí)行完畢后就銷毀,但是存儲空間(只有一個)不會
? ? ? ? // 讓一個執(zhí)行空間不被銷毀,返回引用類型即可,引用類型有引用空間,外面有變量接收了引用空間,我們執(zhí)行空間不會銷毀。
? ? ? ? // 閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),或者把閉包理解成 "定義在一個函數(shù)內(nèi)部的函數(shù)"
? ? ? ? // 閉包形成的條件
? ? ? ? // 1.需要一個不被銷毀的執(zhí)行空間
? ? ? ? // 2.需要直接或者間接返回的返回一個函數(shù)(引用類型)
? ? ? ? // 3.就是內(nèi)部函數(shù)需要訪問到外部函數(shù)的私有變量 ? ?//return出內(nèi)部函數(shù)后,外部也能夠獲得外部函數(shù)的私有變量
? ? ? ? // 4.這時可以把內(nèi)部函數(shù)叫做外部函數(shù)的閉包函數(shù)
? ? ? ? // ?閉包的特點(diǎn)
? ? ? ? // 1.作用域空間不銷毀
? ? ? ? // 優(yōu)點(diǎn): 因為不銷毀,變量也不會銷毀,增加了變量的生命周期
? ? ? ? // 缺點(diǎn): 因為不銷毀,會一直占用內(nèi)存,多了以后就會導(dǎo)致內(nèi)存溢出(手動銷毀設(shè)為null)
? ? ? ? // 內(nèi)存溢出:一塊內(nèi)存一直被占用而得不到釋放,影響瀏覽器的垃圾會收機(jī)制。
? ? ? ? // 2.可以利用閉包在一個函數(shù)外部訪問函數(shù)內(nèi)部的變量
? ? ? ? // 優(yōu)點(diǎn): 可以在函數(shù)外部訪問內(nèi)部數(shù)據(jù)
? ? ? ? // 缺點(diǎn): 必須要時刻保持引用,導(dǎo)致函數(shù)執(zhí)行棧不被銷毀
? ? ? ? // 3.保護(hù)私有變量
? ? ? ? // 優(yōu)點(diǎn): 可以把一些變量放在函數(shù)里面,不會污染全局
? ? ? ? // 缺點(diǎn): 要利用閉包函數(shù)才能訪問,不是很方便