参考: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被保留了下来(没有被销毁)