1. 程式人生 > >JavaScript閉包理解

JavaScript閉包理解

什麼是閉包

普通函式中,函式內部可以直接讀取全域性變數,函式外部無法讀取函式內部的區域性變數。

而閉包能夠讀取其他函式內部變數的函式,由於在 Javascript 語言中,只有函式內部的子函式才能讀取區域性變數,因此可以把閉包簡單理解成 “定義在一個函式內部的函式”。所以,在本質上,閉包就是將函式內部和函式外部連線起來的一座橋樑。

閉包的用途:

  • 可以在函式外部讀取函式內部成員

讓函式內成員始終存活在記憶體中

一些關於閉包的例子

示例1:

 function fn() {
            var n = 10;
            function fn_son() {
                console.log(n);  
            }
        }
//函式fn_son被包括在函式fn內部,這時fn內部的所有區域性變數對fn_son都是可見的。
但是反過來就不行,fn_son內部的區域性變數對fn是不可見的。

示例2:

function fn1() {
            var n = 100;
            return function fn1_son() {
                var a = 50;
                return a;
            }
        }
        var f1 = fn1();
        console.log(f1()); 
//將內部函式作為返回值,此時會在控制檯列印50,此時fn1函式可以訪問到內部函式fn1_son的區域性變數a

示例3:

function getRandom() {
            var random = parseInt(Math.random() * 10 + 1);
            return function() {
                return random;
            }
        }
        var fn = getRandom();
        console.log(fn());
//可以說 閉包就是在一個函式內可以訪問另一個函式內的區域性變數
//上述程式碼段結果是在控制檯 隨機列印一個(0-9)之間的值

注意點

1.由於閉包會使函式中的變數都儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在 IE 中可能會導致記憶體洩漏。解決方法是,在退出函式時,將不使用的區域性變數全部刪除。

2.閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式當作物件使用,把閉包當作它的公用方法,把內部變數當作它的私有屬性,這時一定要小心,不要隨便改變父函式內部變數的值。

3.閉包只能取得包含函式中任何變數的最後一個值。