闭包的定义:
闭包就是能够读取其他函数内部变量的函数。在js中,可以将闭包理解成“函数中的函数“。
闭包的生成有三个必要的条件:
-
在函数a内部间接或者直接return一个函数b
注:直接return一个函数:return function(){}
间接return一个函数:return{bbb:function(){}}
return一个对象或者数组,这个对象中有函数 -
在函数b中使用函数a的私有变量
-
用一个变量接收函数b,形成一个不会销毁的执行空间,如果不接収,执行a(),会被回收
闭包的特点:
1、 延长了变量的生命周期。优点:执行空间不销毁,变量也没有销毁,缺点:变量一直在内存中
2、 可以访问函数内部的私有变量。优点:可以利用闭包函数,访问函数内部的私有变量,缺点:变量一直在内存中
3、保护私有变量。优点:保护私有变量不会被外界访问,缺点:如果要访问,就必须要使用闭包函数
闭包的作用(好处):
1、可以读取函数内部的变量
2、让这些变量的值始终保存在内存中。
使用闭包的注意事项
如果不是万不得已,不要用闭包
1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能会造成内存泄露。(遇到这种问题的解决方案:在退出函数之前,将不使用的局部变量全部删掉)
2、闭包会在父函数外部,改变父函数内部变量的值。(遇到这种问题的解决方案:可以把父函数当做对象使用,把闭包当做公用方法,把内部变量当做私有属性,此时不要随便改变父函数内部变量的值。)
函数的调用:
函数定义的时候在堆中有个函数存储空间,将函数体以字符串形式存入,按照函数名,或者变量名找到对应的存储空间,每一个函数的调用都会开辟一个函数执行空间,进行形参赋值,预解析,里面的内容复制函数存储空间,代码执行完毕,这个执行空间销毁
当函数内部,return一个复杂数据类型时,并且在外面用一个变量接收,这个执行空间就不会销毁,当这个变量指向别的位置时,销毁