参考:https://i.cnblogs.com/EditPosts.aspx?postid=3472016&update=1
闭包:定义在函数内的子函数即为闭包,通过调用该子函数能够从外部读取其父函数的内部变量。
闭包的两个最大用处:
1、读取函数的内部变量;
2、保持其读取的内部变量始终在内存中。
<script type="text/javascript">
function f1() {
var n = 999;
nAdd = function() {
alert(n += 1);
}
//函数f2即为闭包
function f2() {
alert(n);
}
return f2;
}
var result = f1();
result();//输出999,通过闭包读取f1函数的内部变量
nAdd();//输出1000,闭包能保持f1函数的内部变量始终在内存中
</script>
原理解读:系统通过result全局变量持有了函数f2的引用,而f2又依赖f1,使得f1的指针引用继续有效,保证f1中的局部变量都有效,不会被垃圾回收机制回收
加深理解:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());//输出The Window
原理解读:函数本身也是对象,object.getNameFunc()返回了getNameFunc中的匿名函数引用给当前全局的window对象,故在此匿名函数中的this表示全局window对象
///////////////////
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());//输出My Object
原理解读:var that = this;该语句将object对象引用交给局部变量that,getNameFunc中匿名函数使得在getNameFunc外部that被保留了下来(没有被销毁)