閉包的定義:
當函數可以記住並訪問所在的詞法作用域時,就產生了閉包,即使函數是在當前詞法作用域之外執行。
我們來看以下代碼,
function foo() { var a = 2; function bar() { console.log(a); } return bar; } var baz = foo(); baz() // 2
bar() 函數本身當作 一個值類型進行傳遞,顯然,bar在自己定義的詞法作用域以外的地方執行。
同時,拜閉包所賜,使得foo的內部作用域一直存活,不能被回收,以供bar()在之後的任何時間進行引用。bar()依然持有對該作用域的引用,這個引用就叫做閉包。
在定時器、事件監聽器、 Ajax 請求、跨窗口通信、Web Workers 或者任何其他的異步(或者同步)任務中,只要使 用了回調函數,實際上就是在使用閉包!