1.什么是闭包?
- 闭包是一个存在内部函数的引用关系 该引用指向的是外部函数的局部变量对象(前提是内部函数使用了外部函数的局部变量)
2.如何产生闭包
- 函数嵌套
- 内部函数引用外部函数得局部变量
- 内部函数被使用,注意:函数变量提升的时候如果内部函数没有被使用,在预解析的过程中不会定义内部函数
闭包最大的特点:就是它可以记住诞生的环境,比如fn2记住了它诞生的环境是fn1,所以在fn2中可以得到fn1中的内部变量 本质上:闭包就是函数内部和函数外部链接的一座桥梁 闭包就是延长了变量的作用范围
function fn1() {
var a = 1;
function fn2() {
console.log(a);
}
return fn2;
}
var reslut = fn1();
reslut()
3.闭包的优缺点
- 优点:延长外部函数变量对象的生命周期
- 缺点:延长外部函数变量对象的生命周期(占内存,如果不及时清除容易造成内存溢出,泄露)
- 从以下代码我们可以看出来 fn1是全局下得函数,它一旦调用执行完毕了,按道理应该出栈销毁,但是fn2里面得代码却还能访问到fn1里面得变量a,这就说明了延长了外部函数变量对象的生命周期这也是闭包的一个优点,但这也反应出了闭包得缺点如果外部函数变量对象得生命周期一直存在会导致占内存,如果不即使清除会造成内存溢出,泄露
function fn1() {
var a = 1;
function fn2() {
a++;
console.log(a);
}
return fn2;
}
var reslut = fn1();
reslut() //2
reslut() //3
reslut() //4
reslut() //5
reslut = unll; //清除闭包
4.闭包的应用场景
// 闭包得应用场景
(function myModule(w) {
var msg = 'hh';
var sum = 10
function dosomething() {
console.log(msg);
}
function doOtherthing() {
return msg
}
w.myModuleobj2 = { //这里我们给window添加了一个属性,里面传入了俩个方法 这种做法就是将局部函数得方法挂载到全局window中
dosomething: dosomething,
doOtherthing: doOtherthing,
}
})(window) //这里我们传入了一个window,window在全局任何地方都能访问到
// 函数内部得数据(变量,方法)是私有得我们通常会向外去暴露一些方法这些方法可以操作指定得私有数据
// 函数内部得数据(变量,方法)是私有得在外面是不能直接进行调用到得
// dosomething() 报错
myModuleobj2.dosomething(); //hh
console.log(myModuleobj2.doOtherthing()); //hh