閉包是什麼?

閉包的定義:

當函數可以記住並訪問所在的詞法作用域時,就產生了閉包,即使函數是在當前詞法作用域之外執行。

我們來看以下代碼,

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 或者任何其他的異步(或者同步)任務中,只要使 用了回調函數,實際上就是在使用閉包!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章