1. 如何产生闭包?
* 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包
2. 闭包到底是什么?
* 使用chrome调试查看
* 理解一: 闭包是嵌套的内部函数
* 理解二: 包含被引用变量(函数)的对象
* 注意: 闭包存在于嵌套的内部函数中
3. 产生闭包的条件?
* 函数嵌套
* 内部函数引用了外部函数的数据(变量/函数)
function fn1 () {
//闭包开始产生 var a = 3 function fn2 () { console.log(a)
a++; }
return fn2 } var f = fn1()//外部函数使用了内部变量,外部变量一直引用着fn1
f()//3
f()//4
f()//5
f = null;//闭包死亡(引用闭包的函数对象被回收)
闭包给window添加属性
/** * 自定义模块2 */ (function (window) { //私有的数据 var msg = ‘atguigu‘ var names = [‘I‘, ‘Love‘, ‘you‘] //操作数据的函数 function a() { console.log(msg.toUpperCase()) } function b() { console.log(names.join(‘ ‘)) } window.coolModule2 = { doSomething: a, doOtherthing: b } })(window)
向外部暴露多个函数
/** * 自定义模块1 */ function coolModule() { //私有的数据 var msg = ‘atguigu‘ var names = [‘I‘, ‘Love‘, ‘you‘] //私有的操作数据的函数 function doSomething() { console.log(msg.toUpperCase()) } function doOtherthing() { console.log(names.join(‘ ‘)) } //向外暴露包含多个方法的对象 return { doSomething: doSomething, doOtherthing: doOtherthing } }
闭包缺点:
<!-- 1. 缺点 * 函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长 * 容易造成内存泄露 2. 解决 * 能不用闭包就不用 * 及时释放 --> <script type="text/javascript"> function fn1() { var a = 2; function fn2() { a++; console.log(a); } return fn2; } var f = fn1(); f(); // 3 f(); // 4 f = null // 释放 </script>