閉包指的是:能夠訪問另一個(gè)函數(shù)作用域的變量的函數(shù)
js作用域環(huán)境中訪問變量的權(quán)利是由內(nèi)向外的,內(nèi)部作用域可以獲得當(dāng)前作用域下的變量并且可以獲得當(dāng)前包含當(dāng)前作用域的外層作用域下的變量哲鸳,反之則不能测蘑,也就是說在外層作用域下無法獲取內(nèi)層作用域下的變量揭璃,同樣在不同的函數(shù)作用域中也是不能相互訪問彼此變量的醋奠,那么我們想在一個(gè)函數(shù)內(nèi)部也有限權(quán)訪問另一個(gè)函數(shù)內(nèi)部的變量該怎么辦呢?閉包就是用來解決這一需求的咐旧,閉包的本質(zhì)就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)蝶涩。
內(nèi)部函數(shù)總是可以訪問其外部函數(shù)中聲明的變量理朋,當(dāng)通過調(diào)用一個(gè)外部函數(shù)返回一個(gè)內(nèi)部函數(shù)后,即使該外部函數(shù)已經(jīng)執(zhí)行結(jié)束了绿聘,但是內(nèi)部函數(shù)引用外部函數(shù)的變量依然保存在內(nèi)存中嗽上,我們就把這些變量的集合稱為閉包
我們首先知道閉包有3個(gè)特性:
①函數(shù)嵌套函數(shù)
②函數(shù)內(nèi)部可以引用函數(shù)外部的參數(shù)和變量
③參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收
寫一個(gè)for循環(huán),讓它按順序打印出當(dāng)前循環(huán)次數(shù)
閉包的好處
①保護(hù)函數(shù)內(nèi)的變量安全 靠益,實(shí)現(xiàn)封裝丧肴,防止變量流入其他環(huán)境發(fā)生命名沖突
②在內(nèi)存中維持一個(gè)變量,可以做緩存(但使用多了同時(shí)也是一項(xiàng)缺點(diǎn)捆毫,消耗內(nèi)存)
③匿名自執(zhí)行函數(shù)可以減少內(nèi)存消耗
壞處
①其中一點(diǎn)上面已經(jīng)有體現(xiàn)了闪湾,就是被引用的私有變量不能被銷毀冲甘,增大了內(nèi)存消耗绩卤,造成內(nèi)存泄漏途样,解決方法是可以在使用完變量后手動(dòng)為它賦值為null;
②其次由于閉包涉及跨域訪問濒憋,所以會(huì)導(dǎo)致性能損失何暇,我們可以通過把跨作用域變量存儲(chǔ)在局部變量中,然后直接訪問局部變量凛驮,來減輕對(duì)執(zhí)行速度的影響