定义
闭包就是能够读取其他函数内部变量的函数
用一句话总结:对函数外层的变量持有访问权
首先我认为的闭包就是
1.是一个函数
2.可以读取其他函数的内容的变量
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
首先在这里f2就是一个闭包的函数,他是函数也可以访问函数的内部,执行结果,首先在第一次的result的时候,打印的结果是999,因为他可以访问f1的内部的变量,执行后n=999,其次,在第二次执行函数的时候,因为执行了nAdd,,所以值变成了1000
缺点
在这里看到一个问题就是,因为返回f2函数要使用f1的内部作用域变量n,导致n始终留着内存中,不会被垃圾回收机制回收,如果f1内部还有别的数据,当然也不会被清理掉,即使f2不会使用。(闭包的变量不会被回收这就是闭包的特征之一)
优点
举例
function f1(){
var n = 999;
function f2(){
console.log(n)
}
}
如果想要在函数外部得到n 的值就要使用闭包
function f1(){
var n = 999;
function f2(){
console.log(n)
}
return f2
}
让变量始终在内存中
经典的案例,斐波那契数列
(斐波那契数,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。)
var count1 = 0;
var f1 = function(n){
count1++;
if(n==0 || n == 1){
return 1
}
return f1(n-1)+f1(n-2)
}
闭包优化后
var count2 = 0;
var fib2 = (function() {
var arr = [1, 1];//斐波那契数列
return function(n) {
count2++;
var res = arr[n];
if (res) {
return res;
} else {
arr[n] = fib2(n - 1) + fib2(n - 2);
return arr[n];
}
};
})();
/*
for (var i = 0; i < 10; i++) {
alert(fib1(i) + "," + fib2(i));
}
*/
// fib1(11); // 287次
fib2(11); // 21次
// fib1(12); // 465次
fib2(12); // 24 次
//alert(count1);
alert(count2);