閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合。MDN上做了很詳細(xì)的說明:閉包
在這總結(jié)一下自己的理解
要理解閉包就要先了解js的詞法作用域疾掰,詞法作用域意味著作用域是由書寫代碼時(shí)函數(shù)聲明的位置來決定的。當(dāng)一個(gè)塊或函數(shù)嵌套在另一個(gè)塊或函數(shù)中時(shí)区拳, 就發(fā)生了作用域的嵌套晨仑。 因此, 在當(dāng)前作用域中無法找到某個(gè)變量時(shí)痴颊, 引擎就會(huì)在外層嵌套的作用域中繼續(xù)查找赏迟, 直到找到該變量,或抵達(dá)最外層的作用域( 也就是全局作用域) 為止蠢棱。
閉包的應(yīng)用:
- 將函數(shù)與其所操作的某些數(shù)據(jù)(環(huán)境)關(guān)聯(lián)起來锌杀;即為Dom元素綁定回調(diào)函數(shù);
- 閉包模擬私有方法泻仙,即模塊模式內(nèi)糕再,由于閉包的存在,聲明的變量和方法只在該模式內(nèi)部可用玉转。但在返回對(duì)象上定義的變量和方法突想,則對(duì)外部使用者都是可用的。多個(gè)公共函數(shù)可共享一個(gè)詞法作用域;
- 因?yàn)槎鄠€(gè)閉包會(huì)共享同一詞法作用域猾担;在for循環(huán)中綁定事件的時(shí)候我們肯定不希望這樣袭灯,可使用let聲明變量或函數(shù)工廠或匿名閉包,绑嘹,為每一個(gè)回調(diào)創(chuàng)建一個(gè)新的詞法環(huán)境來解決稽荧。