什么是闭包
有权访问其他函数作用域中变量
的函数
。在 javascript
中,只有函数内部的子函数
才能访问局部变量,所以闭包可以理解成"定义在函数内部的函数
"。
在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
闭包最典型的应用是 实现回调函数
(callback)。
不必纠结到底怎样才算闭包,其实你写的每个函数都算作闭包。即使是全局函数,你访问函数外部的全局变量时,就是闭包的体现。
创建闭包的常见方式
在一个函数内部
创建另一个函数
。
举例说明闭包的形成
function a(){
var i = 0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
这段代码有两个特点:
- 函数
b
嵌套在函数a
内部; - 函数
a
返回函数b
;
这样在执行完 var c = a()
后,变量 c
实际上指向了函数 b
,再执行 c()
就会弹出一个窗口显示 i
的值(第一次为1)。这段代码其实就创建了一个闭包。为什么?因为函数a
外部的变量 c
引用了 函数a
内部的函数b
。就是说:当函数a
内部的函数b
被函数a
外部的一个变量引用的时候,就创建了一个闭包。
闭包的作用
闭包可以用在许多地方。它的最大用处有两个
- 读取函数内部的变量
- 让变量始终保存在内存中
闭包的缺点
- 闭包会常驻内存,会增大内存的使用量。
- 使用不当很容易造成内存泄漏。