闭包的作用简单的理解就是在函数外部读取并且修改函数内部声明的局部变量。
function f1() {
var a = 1;
function f2() {
console.log(a);
}
return f2;
}
var result = f1();
result(); // 1
如此这样就读取到函数内部的变量了
一个经典的题
function f1() {
var n = 999;
nAdd = function () {
n += 1
}
function f2() {
alert(n);
}
return f2;
}
var result = f1();
result(); // 999
nAdd();
result(); // 1000
注意点 nAdd没有设置var 所以定义的是一个全局的函数
关于闭包 为什么要重新var一个新的变量去接受返回的函数为什么不makeAdder()()这样直接调用呢
因为每次执行最外面的函数会返回一个新的函数,这个函数不等于之前新建的函数,虽然能产生效果,但是会造成内存浪费问题。
console.log(makeAdder()()===makeAdder()())//false
闭包的应用场景
1 如上可以模拟块级作用域
2 缓存一些数据,提升性能
var fn = (function () {
var cache = {} //将结果缓存到该对象中
return function () {
var str = JSON.stringify(arguments);
if (cache[str]) { //判断缓存中是否存在传递过来的参数,存在直接返回结果,无需计算
return cache[str];
} else { //进行计算并返回结果
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return cache[str] = sum;
}
}
})()
console.log(fn(1,2));