什么是闭包
和其他大多数现代编程语言一样,JavaScript也采用词法作用域(lexical scoping)。也就是,函数的执行依赖于变量作用域,这个作用域是函数定义时决定的。而不是函数执行时决定的。为了实现这种词法作用域,JavaScript函数对象的内部状态不仅包含函数的代码逻辑,还必须引用当前的作用域链(scope chain)。函数可以通过作用域链(scope chain)相互关联起来,函数内部的变量都可以保存在函数作用域内,这种特性称为”闭包”。1
2
3
4
5
6
7
8
9function f1() {
n = 999;
function f2() {
alert(n);
}
return f2;// f2就是一个闭包
}
var result = f1();
result(); // 999
闭包的作用
作用:
- 隐藏变量,避免全局污染
- 可以读取函数内部的变量
缺点:
- 导致变量不会被垃圾回收机制回收,造成内存消耗
- 不恰当的使用闭包可能会造成内存泄漏的问题