关于闭包的理解
发表一下关于闭包的理解:
首先把每一个函数看成一个一个的“小黑屋”小黑屋里面可以看到外面的东西,但外面却看不到小黑屋里面的东西,就好比是函数可以访问外面全局变量,但是外面却访问不了“小黑屋”里面的变量;变量分为全局变量和局部变量;
列:函数可以访问外面全局变量
var a=1;
function fun1(){
alert(a);
}
fun1(); // 1
列:外面却访问不了“小黑屋”里面的变量
function fun2(){
var a=2;
}
alert(a); // a is not defined
但是如果想取到“小黑屋”内部的变量怎么办呢?自然一种叫闭包的东西出来了。
闭包就是可以访问函数内部变量的函数;
闭包就是函数内部嵌套函数,里层函数就叫闭包;
再说一下链式作用域:子函数中可以访问父函数的所有变量。当然也包括全局变量window(一般的函数定义function a(){},其实都是window对象的子函数)
开始举例:因为有链式作用域fun2可以获取到fun1的变量a,所以把fun2当做fun1的返回值不就相当于在最外面可以获取到fun1内部的东西了吗,(记住你的初衷是想获取fun1”小黑屋”内部的东西才引入的fun2)
function fun1(){
a=1;
return function fun2(){
alert(a);
}
}
alert(fun1())
Alert出了fun1的返回值是一个函数再次执行返回的函数即fun1()()
Alert(fun1()())
你最初的想法是想获取小黑屋里面的a但一般是不可以的,用了闭包发现可以了,这就是闭包的作用。闭包还有一个作用因为他可以把函数内部的东西变为全局的东西,不让垃圾回收机制回收a一直在内存中存在,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题;
测试一下自己吧:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
知道输出结果吗?不知道的跟我一步一步来分析吧,首先是定义了一个叫name的字符串,和定义了一个object对象,对象里面有两个属性name和getNameFunc,而getNameFunc后面就是咱们之前说的闭包(内外层函数嵌套),这可以看明白吧,object.getNameFunc()()的意思就是上面例子的fun1()(),至于内层函数的this是指向window的即window.name即正确答案是"The Window"; 如果你答案是"My Object"那应该题目是this.object.name,
参考借鉴:http://www.jb51.net/article/24101.htm