闭包
函数体内的函数对象在被创建时,就可以访问该函数体内的上下文变量,这样就形成“闭包”,
也可以说是个引用了自由变量的函数。
闭包的形成:
一个外围函数里包含了一个内部函数,该内部函数引用了外围函数里的某些自由变量,当内部函数作为返回值,并被执行时,“闭包”就形成了,如下:
//外围函数
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