什么是闭包?
闭包: 能够访问到另一个函数作用域的函数。
非闭包函数简单例子:
function outer () {
var number = 0;
number++;
return number;
}
outer(); // 1
outer(); // 1
上面是一个很简单的例子,调用test函数,使内部变量加1后返回。
但是,当我们有这么一个需求,每次调用test
函数后,都让number+1
,显然上面的代码是无法做到的,因为每调用一次都会重头执行函数,变量都是全新的,无法缓存 number
变量。
解决方法:
- 把number变量定义到全局中(不推荐,应避免定义过多全局变量)
- 使用闭包。(本章主角)
使用闭包缓存变量
闭包例子:
function outer () {
var number = 0;
function inner () {//由于inner引用了外部作用域的number 因此形成了闭包
number++;
console.log(number);
}
return inner;
}
var f1 = outer(); //返回 inner函数
f1(); // 1
f1(); // 2
var f2 = outer(); //返回 inner函数
f2(); // 1
f2(); // 2
上面代码中的 inner
函数中的 number
就是形成闭包的“元凶”,由于inner
函数没有自己的number
变量,所以会引用外部作用域(outer作用域)的number
变量,因此当 inner函数
被返回后,outer 函数
的number
变量得不到释放,因为f
对其有引用,因此number变量一直会在内存中,直到 f = null;
。
因此每次调用f()
都会让相同的引用number
值+1。
这就是闭包。
总结:
可以利用闭包保存函数的变量,并且外部无法直接访问到内部变量。