淺談js閉包

什麼是閉包?

閉包是指有權訪另一個函數作用域中的變量的函數。
學過作用域我們就會知道,凡是函數內部的函數,都可以值執行的前一刻,拿到父級函數的AO對象,也就是父級作用域,而這樣的現象會引發什麼樣的問題呢,我今天就來談一下。

unction a (){
            var sum = 10;
            function b (){
                sum++;
                console.log(sum)
            }
            return b;
        }
        var c = test();
       for(var i =0;i<10;i++){
           c(); // 打印11到20
       }

c執行就是函數b執行,函數b拿到了函數a的變量sum,並且在函數a執行完成以後,沒有銷燬a函數作用域,由c函數一直保留下來,實現累加器功能。在這個過程中c函數訪問到了a函數作用域裏的變量,我們就稱之爲閉包。
這樣的好處就是,js函數都是獨立的,外界無法看到其內部的內容。但是運用閉包我們就可以訪問到函數內部的變量了,同時因爲作用域不會被銷燬,變量可以一直保存在內存中。
這樣是有缺點的,js本身具有垃圾收集機制:找出不再使用的變量,釋放其佔用的內存。但是在形成閉包時,由於外部函數的作用域一直被保存在內部函數的作用域鏈中,不能被釋放,就會造成內存泄漏。所謂內存泄漏其實就是本來應該被回收的內存沒有被釋放,造成你內存空間的減小,存的東西少了,內存就像是泄漏了。
再看一段代碼:

    var name = 'qxh';
    function a (){
        console.log(name);
    }
    function b(){
        var name = 'wkh';
        a();
    }
    b(); // 打印qxh

這裏是沒有閉包的所以打印的是qxh,閉包是指有權訪另一個函數作用域中的變量的函數,我們知道但函數a在執行的前一刻定義時只能訪問到全局的作用域,所以在執行的時候打印的是qxh。

入職不久的小前端從今以後開始自己的技術分享之旅,歡迎建議和批評。

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