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);
  • 保护函数内的变量安全。
  • 在内存中维持一个变量。
相关文章
相关标签/搜索