JavaScript闭包
(1)什么是闭包
【函数】和【函数内部能访问到的变量】(也叫环境),这两个加起来就是一个闭包。
function fn(){
var a = 0;
function f(){
a++;
return a;
}
return f;
}
其中,函数 f
和变量 a
,加起来就是一个闭包。
-
为什么要函数嵌套函数?
为了使变量a
成为局部变量,不能在外部直接访问到。(这就是隐藏变量) -
为什么
return
一个函数f
?
为了使在外部能调用到这个函数f
,否则就不能对变量a
进行操作。(这就是暴露函数)
如果执行以下代码:
var f1 = fn();
f1(); //此时a=1
f1(); //此时a=2
- 为什么第二次执行
f1()
后,a=2
,而不是a=1
?
因为局部变量a
不会在函数fn被调用完之后,就被垃圾回收机制回收,而是继续保留在内存中,下一次调用函数f
时,使用的还是这个变量a
,所以是在a=1
的基础上+1
,得到a=2
。
(2)闭包的作用是什么
间接的访问一个变量,也算是隐藏一个变量。
如果把这个变量直接定义为一个全局变量,那不够安全,所以就利用闭包,把变量定义为一个局部变量,再暴露一个函数,函数内部再来对这个变量进行操作。
在外部调用这个函数,再访问局部变量,也就是一个间接的访问。