闭包的含义
-
如何产生闭包?
-
当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包。
-
-
闭包到底是什么?
-
使用chrome调试查看
-
理解一:闭包是嵌套的内部函数(绝大部分人)
-
理解二:包含被引用变量(函数)的对象(极少数人)
-
注意:闭包存在于嵌套的内部函数中
-
-
产生闭包的条件?
-
函数嵌套
-
内部函数引用了外部函数的数据(变量/函数)
-
执行外部函数
-
注意:调用外部函数才会产生闭包
-
闭包的生命周期
-
产生:在嵌套内部函数定义执行完时就产生了(不是在调用) //函数提升,内部函数对象已经创建了
-
死亡:在嵌套的内部函数成为垃圾对象时 //闭包死亡(包含闭包的函数对象成为垃圾对象)
闭包的应用:定义JS模块
-
具有特定功能的JS文件
-
将所有的数据和功能都封装在一个函数内部(私有的)
-
只向外暴露一个包信n个方法的对象或者函数
-
模块的使用者,只需要通过模块暴露的对象调用方法来实现对应的功能
(function() {
var test1 = "hello"
function fn1() {
console.log("fn1()" + test1);
}
function fn2() {
console.log("fn2()" + test1);
}
window.test2 = {
fn1: fn1,
fn2: fn2
}
})()
test2.fn1()
test2.fn2()
function test1() {
var test2 = "hello"
function fn1() {
console.log("fn1:" + test2);
}
function fn2() {
console.log("fn2:" + test2);
}
return {
fn1: fn1,
fn2: fn2
}
}
var test3 = test1()
test3.fn1()
test3.fn2()
利用闭包,向外暴露对象
闭包的缺点及其解决方法
-
缺点
-
函数执行完后,函数内的局部变量没有释放,占用内存时间会变长
-
容易造成 内存泄漏
-
-
解决
-
能不用闭包就不用
-
及时释放:让内部函数成为垃圾对象 回收闭包
-
内存溢出与内存泄漏
-
内存溢出
-
例子: var obj = {} for (var i=0;i<=1000,i++){ obj[i]=new Array(1000000) }
-
一种程序运行出现的错误
-
当程序运行需要的内存超过了剩余的内存时,就会抛出内存溢出的错误
-
-
内存泄漏
-
占有的内存没有及时释放
-
内存泄漏积累多了就容易导致内存溢出
-
常见的内存泄漏
-
意外的全局变量
-
没有及时清理的计时器或者回调函数
-
闭包
-
-