什么是闭包?
有二个函数,相互嵌套。内层函数引用了外层函数的变量。这就是闭包
function fn(){ var num=1 function fn2(){ console.log(num) } }
闭包形成的条件?
1. 内部函数使用了外函数的变量(还包括外部函数的参数)
function fn(){ var num=1 function fn2(){ console.log(num) //这个num引用了外部的num } }
2. 外部函数返回了内部函数。function fn(){ var num=1 function fn2(){ console.log(num) } return fn2 //把函数fn2通过return返回出去 } 上面就是外层函数return返回内部函数 下面是更深入的补充: ----------------------------------------------------------------------------------------- 这里详细说明一下为什么要用return,我可不可以直接fn2()直接调用吗? return 返回出去的是这个fn2函数本身。因为函数是引用类型,引用的是函数的地址。每次的值都会被保存。 例如:我把fn2用return返回出去------这里是一个每次调用都会自加的计数器案例 function fn(){ var num=0 function fn2() { num++ console.log(num) } return fn2 } var f=fn() 这里我们调用fn()函数,执行函数fn()函数体内的代码, 返回的结果是function fn2(){}这个函数体,这个时候函数 内部还没有被调用。我们在用f()进行调用。然后fn2内部的 num就会引用了外层的num。 f() //每次调用都会加1 如果return返回的是函数本身,函数是引用类型的。每次引用的都是地址。那么每次都会在原有的基础上去想加。如果把return fn2换成 fn2()直接调用。那么每次调用完内部函数就会销毁。每次的结果都是0. 为什么我们把return返回出去就不会被释放销毁了呢?我们把return返回出去。然后用f去接收。这样f就会指向fn2这个函数。内存就不会被销毁释放。而在函数内部调用函数。内存调用完会被立即销毁释放掉。
3. 在函数外,有变量引用函数内var f = fn(); //此处调用函数fn,执行的结果就是函数fn2 f(); //此处调用的是fn2这个函数,执行以后指向外层函数的变量
闭包的作用:
访问函数内部变量、保持函数环境中一直存在,不会被垃圾回收机制处理
闭包的优点:保护函数内变量的安全不会被修改。在内存中维持一个变量,可以做缓存。
闭包的缺点:因为使用闭包,可以使函数在执行完后不被销毁,保留在内存中,如果大量使用闭包就会造成内存泄露,内存消耗很大
注意点:频繁的使用闭包会造成内存泄露。记得在退出函数之前,将不使用的局部变量赋值为null;