闭包及相关

91 阅读1分钟

如何产生闭包

  • 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包

闭包到底是什么

  • 使用chrome查看
  • 理解一:闭包是嵌套的内部函数(绝大部分人)
  • 理解二:包含被引用变量(函数)的对象(极少数人)
  • 注意:闭包存在于嵌套的内部函数

产生闭包的条件

  • 函数嵌套
  • 内部函数引用了外部函数的数据(变量/函数)

闭包的作用

  • 使用函数内部的变量在函数执行完成后,仍然存活在内存中(延长了局部变量的生命周期)
  • 让函数外部可以操作(读写)到函数内部的数据(变量/函数)

缺点

  • 函数执行完后,函数内的局部变量没有释放,占用内存时间会变长
  • 容易造成内存泄漏

解决

  • 及时释放(null->让内部函数成为垃圾对象,回收闭包)

内存溢出

  • 一种当程序运行出现的错误
  • 当程序运行需要的内存超过了剩余的内存时,就抛出内存溢出的错误
var obj = {}
for(var i=0;i<10000;i++){
    obj[i] = new Array(10000000)
    console.log('111111')
}

内存泄露

  • 占用的内存没有及时的释放
  • 内存泄露积累多了就容易导致内存溢出 --常见的内存泄露:
  • 意外的全局变量
function fn(){
    a = 1
    console.log(a)
}
fn()
  • 没有及时清理的计时器或回调函数
var intervalId = setInterval(function(){
    console.log('11111')
},1000)
  • 闭包
function fn(){
    var a = 1
    function fn1(){
        console.log(++a)
    }
    return fn1
}
var f = fn()
f()
// f = null (没有将变量a释放)