闭包的定义
- 一个函数和其对周围状态的引用捆绑在一起,这样的组合叫做闭包(closure)。
也就是说闭包使得我们可以在一个内层函数中访问到外层函数的作用域。
闭包的定义显然很难理解,为了帮助理解,下面我们来看一段代码。
function parent()
{
var num = 100;
function son()
{
alert(num);
}
return son;
}
var son1 = parent();
son1();
很显然,在这段代码中,内部函数son1()引用了外部函数parent()的局部变量。
很有趣的是,外部函数的返回值是内部函数,这就使得我们可以在全局作用域下访问内部函数,也就使得外部函数的局部变量不会因为外部函数的调用结束而销毁。
- 在这里,son1是执行parent时创建的son的实例 的引用,而son的实例又有对parent的局部变量的引用,因此parent的局部变量一直存在于内存中。
为什么使用闭包
- 如果我们现在有一个重要变量,我们需要在全局作用域下使用这个变量,又不想这个重要变量可以被任意的访问(任意地访问很可能导致错误的修改了变量的值),这时我们可以使用闭包。
闭包的缺点
- 由于闭包导致局部变量一直存在于内存中,所以使用闭包内存开销会很大。
- 如果在使用完闭包之后,不再需要某一个局部变量,这时我们需要把这个局部变量从内存中删除,否则会导致内存泄漏。
- 内存泄漏,是指不需要的或访问不到的变量依然占据着内存空间。