什么是闭包??
理解一:闭包是嵌套的内部函数(绝大多数人)
理解二:包含被引用变量(函数)的对象(少数人)
我当然就是大多数人的一个,自我感觉第一种更好理解。当然不是说第二种不重要,我们也是需要知道的
闭包的存亡
闭包产生的条件:(1)函数嵌套
????????????????????????? ? ?(2)内部函数调用外部函数的变量或函数
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3)外部函数被调用
闭包消失的条件:当内部函数成为垃圾对象的时候(什么是垃圾对象呢??)
没有引用指向堆区空间的对象成为垃圾对象
什么条件下成为垃圾对象??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1) 匿名对象使用完毕 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2) 对象被赋值为null ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3) 对象被重新创建 ???????????????????????????????(4) 引用所在的方法执行结束
闭包的作用:
(1)使函数内部的数据在外部函数执行完之后仍能够存活在内存中(延长局部变量的声明周期)
(2)让函数外部可以操作函数内部的变量或方法
(3) 可以避免使用全局变量,防止全局变量污染环境;
闭包的实例:面试题
function fun(n, o) {
console.log(o);
return {
fun: function (m) {
return fun(m, n)
}
};
}
//第一问
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
//第二问
var b = fun(0).fun(1).fun(2).fun(3);
//第三问
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
可以去思考下每次输出的都是什么?产生了多少次闭包?很有趣!
答案:
(1)undefined? 0? 0? 0
解释:? ?var a = fun(0)将闭包保存,而之后的每一次调用闭包很快产生,又很快消失
(2)undefined? 0? 1??2
解释:整个过程产生的闭包都没有消失,只不过被同名的b给一次次覆盖了
(3)undefined? 0? 1? 1
解释:可以结合上面两种产生闭包的方式去向
|