每次外部函数执行完,就会被内存彻底销毁,所以每次调用外部函数都是创建了一个新的地址指针,即一个全新的函数,对变量是没有保存功能的;而闭包则不会被销毁,也就拥有了保存功能,会将外部函数最终得到的值存储下来。
下面有几个例子增加理解:
1、闭包的存储功能
// 正例
var a = 0;
function outerFn(){
return function innnerFn(){
a++;
console.log(a);
};
}
var inner = outerFn();
inner();
// 反例
var a1 = 0;
function outerFn1(){
a1++;
return function innnerFn1(){
console.log(a1);
};
}
var inner1 = outerFn1();
inner1();
2、外部函数地址指针变化
function outerFn3(){
var b = 3;
return function innerFn3(){
return ++b;
};
}
// 正例
var inner3 = outerFn3();
inner3();
// 反例
outerFn3()();
3、自执行函数
var outerFn4 = (function() {
var c = 4;
return function innerFn4(){
return ++c;
};
})();
outerFn4();
以下是个人思考,有不对的请多多指教。
对应思考:
1、闭包的存储功能
var inner = outerFn(); 调用了一次外部函数,之后无论是 inner() 还是 inner1() 都是在执行闭包。如果闭包不具备保存功能,那么两个应该都是1。
2、外部函数地址指针变化
outerFn3()();每次被执行,外部函数也都被执行,那么b就被重新赋值成3,再执行闭包也是在3的基础上++,所以每次都是4。
3、自执行函数
自执行即外部函数被调用一次,那之后执行的 outerFn4() 也是执行闭包。