javascript - 閉包定義及應用場景

什麼是閉包

閉包是指有權訪問另外一個函數做用域中的變量的函數。緩存

function createFunc() {
    var name = "wheeler";
    return function () {
        return name;
    }
}

var nameFunc = createFunc();  // nameFunc是一個閉包

var name = nameFunc();

console.log(name);

// 解除對匿名函數的應用(以便釋放內存)
nameFunc=null;

內部函數能夠訪問外部函數的變量name,內部函數的做用域包含了外部函數的做用域
(因爲閉包會攜帶包含它的函數的做用域,可能致使內存佔用過多,所以謹慎使用閉包)安全

能夠經過模仿塊級做用域減小閉包致使的內存佔用過多

// 塊級做用域(一般稱爲私有做用域)的匿名函數的語法
(function(){
    // 塊級做用域
})();

將閉包定義在塊級做用域裏面閉包

// 能夠減小閉包占用的內存問題,由於沒有指向匿名函數的引用。只要函數執行畢,就能夠當即銷燬其做用域鏈了
(function(){
    function createFunc() {
        var name = "wheeler";
        return function () {
            return name;
        }
    }

    var nameFunc = createFunc();

    var name = nameFunc();

    console.log(name);
})();

閉包的應用場景

  • 用閉包模擬私有方法
var returnNum = (function () {
    var num = 0;

    function changeNum(value) {
        num = value;
    }

    return {
        add: function () {
            changeNum(10);
        },
        delete: function () {
            changeNum(-10);
        },
        getNum: function () {
            return num;
        }
    }
})();

// 閉包
console.log(returnNum.getNum());
returnNum.add();
console.log(returnNum.getNum());
returnNum.delete();
console.log(returnNum.getNum());
  • 緩存
var CacheCount = (function () {
    var cache = {};
    return {
        getCache: function (key) {
            if (key in cache) {// 若是結果在緩存中
                return cache[key];// 直接返回緩存中的對象
            }
            var newValue = getNewValue(key); // 外部方法,獲取緩存
            cache[key] = newValue;// 更新緩存
            return newValue;
        }
    };
})();

console.log(CacheCount.getCache("key1"));
  • 封裝
var person = function(){
    var name = "default";//變量做用域爲函數內部,外部沒法訪問
    return {
        getName : function(){
            return name;
        },
        setName : function(newName){
            name = newName;
        }
    }
}();

console.log(person.name);// undefined
console.log(person.getName());
person.setName("wheeler");
console.log(person.getName());
  • setTimeout
function func(param) {
    return function() {
        console.log(param);
    }
}
var myFunc = func('wheeler');
setTimeout(myFunc, 1000);
  • 保護函數內的變量安全。
  • 在內存中維持一個變量。
相關文章
相關標籤/搜索