1. 什么是闭包
闭包是指有权访问另一个函数作用域中的变量的函数。
2. 如何创建一个闭包
最常见的方式,就是在一个函数内部创建另一个函数,并返回该函数。
举一个简单的例子:
function fn1() {
var a = 1;
function fn2() {
a++;
console.log(a);
}
return fn2;
}
var fn3 = fn1();
fn3();
最后输出
2
在这里,fn2可以访问fn1的作用域,将fn2作为返回值。fn1执行后,将fn2的引用赋值给fn3,执行fn3,输出变量a。
这里fn3函数访问了fn1函数里的变量a,所以形成了一个闭包。
3. 为什么要用闭包
闭包的主要作用是:
- 读取函数内部的私有变量。
- 防止对全局作用域的污染。
4. 闭包的注意事项
- 通常,函数的作用域及其所有变量都会在函数执行结束后被销毁,由于闭包会使得函数中的变量都被保存在内存中,过度使用闭包会导致内存占用过多。
5. 闭包的应用
闭包的应用比较典型是定义模块,我们将操作函数暴露给外部,而细节隐藏在模块内部。
例如:
function module() {
var arr = [];
function add(val) {
if (typeof val == 'number') {
arr.push(val);
}
}
function get(index) {
if (index < arr.length) {
return arr[index]
} else {
return null;
}
}
return {
add: add,
get: get
}
}
var mod1 = module();
mod1.add(1);
mod1.add(2);
mod1.add('xxx');
console.log(mod1.get(1));
最后输出
2
参考文章: