闭包

闭包是一个非常强大的特性,但人们对其也有诸多误解。一种耸人听闻的说法是闭包会造成
内存泄露,所以要尽量减少闭包的使用。

局部变量本来应该在函数退出的时候被解除引用,但如果局部变量被封闭在闭包形成的环境 中,那么这个局部变量就能一直生存下去。从这个意义上看,闭包的确会使一些数据无法被及时 销毁。使用闭包的一部分原因是我们选择主动把一些变量封闭在闭包中,因为可能在以后还需要 使用这些变量,把这些变量放在闭包中和放在全局作用域,对内存方面的影响是一致的,这里并 不能说成是内存泄露。如果在将来需要回收这些变量,我们可以手动把这些变量设为 null。

跟闭包和内存泄露有关系的地方是,使用闭包的同时比较容易形成循环引用,如果闭包的作 用域链中保存着一些 DOM 节点,这时候就有可能造成内存泄露。但这本身并非闭包的问题,也并非 JavaScript 的问题。在 IE 浏览器中,由于 BOM 和 DOM 中的对象是使用 C++以 COM 对象 的方式实现的,而 COM 对象的垃圾收集机制采用的是引用计数策略。在基于引用计数策略的垃圾回收机制中,如果两个对象之间形成了循环引用,那么这两个对象都无法被回收,但循环引用造成的内存泄露在本质上也不是闭包造成的。

同样,如果要解决循环引用带来的内存泄露问题,我们只需要把循环引用中的变量设为 null 即可。将变量设置为 null 意味着切断变量与它此前引用的值之间的连接。当垃圾收集器下次运 行时,就会删除这些值并回收它们占用的内存。

闭包

外层函数返回的,具有外层函数变量的内层函数

闭包的优点

闭包配合外层函数封装了一个独立的命名空间,内外部的代码不会相互干扰污染;

闭包的缺点

闭包一旦被外部变量持有,其声明时持有的内外作用域都要一直有效,无法被垃圾回收自动回收销毁,因此程序内一定要谨慎使用闭包

function outer(){
    var a = 100;
    return function(){
        console.log(a);
    }
}
var bb = outer();
bb();

//通常,闭包配合外部匿名自执行函数一同使用
var getVersion = function(){
    var CERSION = "1.09";
    return function(){
        return VERSION;
    }
}()
console.log(getVersion());


//写一个闭包实例
var confUtil = (function(){
    var CONF = {
        author:"tom",
        version:"1.01"
    }
    return {
        getPro:function(proName){
            return CONF[proName];
        },
        addPro:function(){
            CONF[proName] = proValue;
        },
        modPro:function(){
            CONF[proName] = proValue;
        },
        delPro:function(){
            delete CONF[proName];
        }
    }
})()


// 经典面试题
function a() {
    for(var i = 0 ; i< 10 ; i++) {
        setTimeout(function() {
            console.log(i)
        }, 0)
    }
} // 输出10个10

// 方法1 将var改成let
// 方法2 传入setTimeout的第三个参数
function a() {
    for(var i = 0 ; i< 10 ; i++) {
        setTimeout(function() {
            console.log(i)
        }, 0, i)
    }
}
// 方法3 闭包
function a(){
    for (var i = 0; i < 10; ++i) {
        setTimeout(
            (function(i){
                return function(){
                    console.log(i)
                }
            })(i), 0);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 谈起闭包,它可是JavaScript两个核心技术之一(异步和闭包),在面试以及实际应用当中,我们都离不开它们,甚至...
    强哥科技兴阅读 573评论 0 1
  • 闭包: 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该...
    小裁缝sun阅读 634评论 0 5
  • 对于JavaScript程序员来说,闭包(closure)是一个难懂又必须征服的概念。闭包的形成与变量的作用域以及...
    yufawu阅读 416评论 0 6
  • 总觉得今天晚上该写点什么,题起笔就想开始,那么急切,那么渴望。 在看安妮宝贝写的彼岸花时,流泪了,这是经常的吧。但...
    鱼目集阅读 206评论 0 1
  • 【早安心语】今天是11月23日,星期五,农历十月十六,这是多么美好的一天啊。人们都希望在这辈子能有所成就,做的事业...
    解宗会阅读 150评论 0 0