闭包
什么是闭包
闭包(closure)指有权访问另一个函数作用域中变量的函数。----------------- JavaScript 高级程序设计
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。--------------------- MDN
简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。
举例说明如下:
function fn() { // fn就是闭包
var num = 1; // num 是一个被 fn 创建的局部变量
function fun() { // fun 是一个内部函数
console.log(num); // 使用了父函数中声明的变量
}
return fun();
}
fn(); // 1
闭包的作用
- 延伸变量的作用范围。 下列代码可以从fn外部得到fn内部的局部变量num
function fn() {
var num = 10;
return function () {
console.log(num); // 10
};
}
var f = fn();
f();
- 函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,如果创建了一个闭包的话,这个函数的作用域就会一直保存到闭包不存在为止。
function fn() {
var num = 10;
return function () {
console.log(num); // 10
};
}
var f = fn();
f();
还是这一段代码,fn形成闭包的作用域,其中的变量会保留下来。
不当使用闭包的弊端
使用闭包可以使当前上下文不被释放,则当前上下文中的私有变量和值会被保存。但是如果大量使用闭包,会导致栈内存不断增大,页面渲染变慢,影响程序性能,严重会造成内存泄漏;所以应该合理使用闭包。