JS代码
function fn() {
var num = 3;
return function() {
var n = 0;
n++;
num++;
console.log('n=' + n);
console.log('num=' + num);
}
}
var fn1 = fn();
fn1(); // 1 4
console.log("------");
fn1(); // 1 5
变量 num 在函数执行完毕后没有被销毁,当我第二次调用 fun1
的时候输出 num=5,而变量 n 每次执行时都会创建一个新的,导致两次调用输出都是 1,这是为什么?同样都是函数内部的变量
变量 num 在执行过程中是如何被保留下来的?
你每次执行
fn1
,里面的var n = 0
,都把n
初始化为0
了。fn
其实也遵循这个规律,函数都这样。但是,你的
fn
在复赋值给fn1
之后,就没有再执行了。所以里面的num
没有被重新赋值,又由于闭包的作用让它不会被销毁(语言引擎特性),使得你在每次调用fn1
都可以访问到它累积起来的值。回到开头的话,你的
fun1
就有能力访问fn
内部的num
。也就形成了闭包。闭包的特性就使得num
不会被销毁(因为外面有函数可能会访问num
,不销毁才合理)。附一下阮一峰的闭包文章(阮一峰,我的hero!)
学习Javascript闭包(Closure)