閉包是什么
在 Javascript 中,閉包是一個(gè)讓人很難弄懂的概念。ECMAscript 中給閉包的定義是:閉包,指的是詞法表示包括不被計(jì)算的變量的函數(shù),也就是說,函數(shù)可以使用函數(shù)之外定義的變量。
是不是看完這個(gè)定義感覺更加懵逼了?別急,我們來分析一下。
閉包是一個(gè)函數(shù)
閉包可以使用在它外面定義的變量
閉包存在定義該變量的作用域中
好像有點(diǎn)清晰了,但是使用在它外面定義的變量是什么意思,我們先來看看變量作用域。
變量作用域
變量可分為全局變量和局部變量。全局變量的作用域就是全局性的,在 js 的任何地方都可以使用全局變量。在函數(shù)中使用 var 關(guān)鍵字聲明變量,這時(shí)的變量即是局部變量,它的作用域只在聲明該變量的函數(shù)內(nèi),在函數(shù)外面是訪問不到該變量的。
可以看出,在第一次調(diào)用完 func2 之后,func 中的變量 a 變成 'linxin a',而沒有被銷毀。因?yàn)榇藭r(shí) func1 形成了一個(gè)閉包,導(dǎo)致了 a 的生命周期延續(xù)了。
這下子閉包就比較明朗了。
閉包是一個(gè)函數(shù),比如上面的 func1 函數(shù)
閉包使用其他函數(shù)定義的變量,使其不被銷毀。比如上面 func1 調(diào)用了變量 a
閉包存在定義該變量的作用域中,變量 a 存在 func 的作用域中,那么 func1 也必然存在這個(gè)作用域中。
現(xiàn)在可以說,滿足這三個(gè)條件的就是閉包了。
下面我們通過一個(gè)簡單而又經(jīng)典的例子來進(jìn)一步熟悉閉包。