js闭包特性

  1. 各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
  2. Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

快速上手闭包

function getCache() {
    var cacheData = {
        list:{},
        str:{}
    };
    var get = function (alias) {
        if(cacheData['list'][alias] == null || cacheData['list'][alias] == undefined){
            set(alias);
        }
        return cacheData['list'][alias];
    };
    var set = function (alias) {
        $.ajax({
                type: "get",
                url: ctxPath + "houze/houseList",
                data: {name: alias},
                async:false,
                contentType:"application/json",
                success:function (data) {
                    cacheData['list'][alias] =  data;
                }
            }
        )
    };
    return get;
}
var fwList = getCache();

调用效果以及展示:
js 使用闭包特性实现缓存功能,减少频繁调用ajax_js

使用闭包的注意点

因为闭包会保留它们包含函数的作用域,所以比其他函数更占用内存。过度使用闭包可能导致内存过度占用,因此建议仅在十分必要时使用。V8等优化的JavaScript引擎会努力回收被闭包困住的内存,不过我们还是建议在使用闭包时要谨慎.
闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值