首先要知道JavaScript是使用垃圾回收的语言,它会每隔一段时间就会释放内存进行闲置资源回收。像函数中的局部变量,函数执行时在内部使用了变量,栈内存会分配空间以保存相应的值。在函数使用结束后,这个局部变量就不需要了,占用的内存就会被释放。
那我们若是想要使这个变量不被清理,一直处于被使用中,那就得让他一直被引用,那么我们可以在一个函数里面嵌入一个函数,小函数里面引用大函数里的变量,并把这个函数返回到全局中,此刻我们便可让它不被清理并在全局中使用它了
放代码:
1 function big(){//大函数 2 var savevar = 10;//数据 3 function little(){//小函数 4 return savevar;//引用大函数的数据,并把数据返回出去 5 } 6 return little;//把小函数返回出去 7 } 8 var deal = big();//调用大函数,返回出来小函数 9 console.log(deal); // 返回的是little()这个小函数函数,如果要访问到num就需要调用这个函数 10 var money = deal(); //调用小函数,返回出来小函数里操作的值 11 console.log(money) // 10,输出
那平常使用闭包有什么好处呢?
优点:
- 作用域空间不销毁,所以变量也不会被销毁,增加了变量的声明周期
-
在函数外部可以访问函数内部的变量
-
护私有变量,将变量定义在函数内,不会污染全局
缺点:
-
因为函数外部可以访问函数内部的变量,导致变量和内部的函数引用关系一直存在,内存不能销毁,会一直占用,使用量较大时会导致内存溢出
详细见另外一篇《函数自调用与闭包》