闭包(closure)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_35407267/article/details/54237561

闭包是面试中常问到的一个问题,但是这种概念性的东西有时候写的时候不自觉的就能使上,但是陈述的时候又会表达的含混不清。记录之以备忘。

函数字面量定义在其他函数中时,它不仅可以访问自己的参数和变量,同时它也能访问把它嵌套在其中的父函数的参数和变量。通过函数字面量创建的函数对象包含一个连接到外部上下文的链接。这就成为闭包

错误之源在于JavaScript中没有C,JAVA语言中的块级作用域括(在一堆花括号中的一组语句)其中的变量在代码块之外是不可见的,定义在代码块中的变量执行结束后会被释放掉。而JavaScript有函数作用域,定义在其中的参数和变量在函数外部是不可见的,而在函数内部任何位置定义的变量,在该函数内部任何地方都可见。

举个栗子,我们店给string增加一个deentityify的方法,任务是寻找字符串中的html字符实体,换成对应的字符。这就需要保存字符实体的名字和他们对应的字符。但我们在那保存这个对象呢?全局变量是魔鬼。我们可以把它定义在函数的内部,但是会带来运行时的损耗,因为每次执行该函数的时候该字面变量都会被求一次值。理想的方式是把它放入一个闭包。

String.prototype.deentityify=function(){
    var entity={
        quot:'"',
        lt  :'<',
        gt  :'>'
    };
    //返回要定义的deentityify方法
    return function(){
        //查找‘&’开头和‘;’结束的字符串。如果这些字符串可以在字符串实体中找到,
        //那么就将该字符实体替换为映射中的值。
        return this.replace(/&([^&;]+;/g,function(a,b){
            var r=entity[b];
            return typeof r==='string' ? r: a;
        }   
    }
}();

闭包的一般形式为:一个定义了私有变量和函数的函数。利用闭包创建可以访问私有变量和函数的特权函数,最后返回这个特权函数。私有变量的状态可以得以保存。

猜你喜欢

转载自blog.csdn.net/baidu_35407267/article/details/54237561
今日推荐