闭包
0. 代码¶
function foo() {
var count = 0;
debugger; // (1)
function bar() {
debugger; // (2)
count++;
console.log(count);
}
return bar;
}
foo(); // STEP 1:产生闭包
var f = foo(); // STEP 2
f(); // STEP 3
f = null; // STEP 4:闭包死亡
foo()早就执行结束了,但是foo()执行上下文环境还存在与栈中,因此bar()时,count可以查找到。
1. 闭包是什么?¶
- 存在于 内部函数,
- 一个 对象,
- 对象的 属性 是被引用的外部变量。
2. 产生闭包的条件?¶
- 函数嵌套
- 内部函数引用外部函数的变量
- 调用外部函数
3. 继续用内部函数¶
4. 闭包的生命周期¶
- 产生:内部函数声明时产生 (STEP 1)
- 销毁:内部函数成为垃圾对象时 (STEP 4)
5. 内存溢出和内存泄漏¶
- 函数执行完,局部变量没有释放,占用内存时间变长。
- 内存溢出:程序运行时,需要内存超过剩余内存,抛出内存溢出错误。
- 内存泄漏:占用的内存没有及时释放。
- 意外的全局变量
- 没有及时清理计时器或观察者回调函数
- 闭包
6. 思考题1¶
function fn(n, o) {
console.log(o);
return {
fn: function(m) {
return fn(m, n)
}
}
}
var a = fn(0); a.fn(1); a.fn(2); a.fn(3);
var b = fn(0).fn(1).fn(2).fn(3);
var c = fn(0).fn(1); c.fn(2); c.fn(3);
6. 思考题2¶
思考一下以下代码产生了闭包吗?
function foo() {
var count = 0;
debugger; // (1)
function bar() {
count++;
console.log(count);
}
}
foo(); // STEP 1:产生闭包吗?