闭包

函数体内的函数对象在被创建时,就可以访问该函数体内的上下文变量,这样就形成“闭包”,

也可以说是个引用了自由变量的函数。

 

闭包的形成:

一个外围函数里包含了一个内部函数,该内部函数引用了外围函数里的某些自由变量,当内部函数作为返回值,并被执行时,“闭包”就形成了,如下:

 

//外围函数 

function 闭包实体(){

 

     var 自由变量 = "函数体内的变量"; // 1

 

  //内部函数

     function 提供的函数(){

          alert(自由变量); //注意“自由变量”,是最后所保存的值

     };

    //如在这修改 “自由变量”: 自由变量="在这修改";

 

     return 提供的函数; //2

}

 

var 产生闭包 = 闭包实体();//3

 

产生闭包();//4

 

1+2+3+4 同时成立,才能形成“闭包”

 

理解的例子

 

var name="window";
    var object = {
        name:"me",
        getname:(function(){
            return function(){
                return this.name;
            }
        })()  //执行并返回函数体给 getname, 此时的 this 未指向谁,因为该函数体未被执行
    };
    alert(object.getname());    //结果:me,此时执行函数体的是object,所以该函数体内的this 指向 object


    name="window";
    var object1 = {
        name:"me",
        getname:(function(){
            var that=this;
            return function(){
                return that.name;
            }
        })() //执行并返回函数体给 getname, 此时的 that 是指向window,因为是window执行了该函数,所以this指向window,并且返回的函数体使用了闭包
    };
    alert(object1.getname());    //结果:window,此时执行函数体的是object1,但由于闭包的存在,that 还是指向window


    name="window";
    var object2 = {
        name:"me",
        getname:function(){        //该函数由 object2执行,所以this是指向 object2的,其执行结果是返回一个函数体,并且返回的函数体使用了闭包
            var that=this;         
            return function(){
                return that.name;
            }
        }
    };
    alert(object2.getname()());   //结果:me
posted @ 2011-12-16 20:04  Yu  阅读(247)  评论(0编辑  收藏  举报