1.什么是闭包
http://blog.csdn.net/XIAOZHUXMEN/article/details/52281301
闭包是词法闭包的简称,是引用了自由变量的函数,这个被引用的变量将和这个函数一起存在,即使已经离开了创造它的环境也不例外;
闭包不是私有啊,闭的意思不是“封闭内部状态”,而是封闭外部状态,一个函数如何能够封闭外部状态呢,当外部状态的scope失效的时候,还有一份留在内部状态里面。
所谓闭包就是,当你在函数的内部又声明了另一个函数,内部函数的作用域链中就会包含外部函数的变量对象,所以内部函数就有权访问外部函数定义的变量,而当外部函数执行完后,其变量对象仍存在于内存之中,这样就像是封闭了外部状态。
example:
①这个例子说明局部变量没有被复制,它们是通过引用保持的。这就好像是函数执行完毕后,仍然有内存记忆一样。
function showNum1() {
var num =42;
var show = function () {
console.log(num);
}
num ++;
return show;
}
var showNum = showNum1();
showNum();// 43
②
var gLogNumber, gIncreaseNumber, gSetNumber;
function setupSomeGlobals(){
var num =42;
gLogNumber =function() {console.log(num);}
gIncreaseNumber =function(){num++;}
gSetNumber =function(x){num = x;}
}
setupSomeGlobals();//外部函数被调用
gIncreaseNumber();
gLogNumber();// 43
gSetNumber(5);
gLogNumber();// 5
var oldLog = gLogNumber;
setupSomeGlobals();//外部函数被调用
gLogNumber();// 42
oldLog()// 5
这三个函数gLogNumber, gIncreaseNumber, gSetNumber 共享访问同一个闭包,即setupSomeGlobals()的局部变量。
特别注意:在上面的例子中,当第二次调用setupSomeGlobals()时,一个新的闭包(stack-frame堆栈框架)就被创建了。原来的 gLogNumber, gIncreaseNumber, gSetNumber被新的匿名函数给重写。在JavaScript中,只要你在一个函数内部声明了另一个函数,只要外部函数被调用,那么内部函数就会被重新创建。
③在desktop/study/closure