闭包就是能够读取其他函数内部变量的函数。
在本质上, 闭包就是将函数内部和函数外部连接起来的一座桥梁。
<script>
function fn() {
var a = 100;
function son() {
// console.log(a);
return a;
}
return son();
}
a_ = fn();
console.log(a_);
</script>
闭包的好处,保护变量不被污染
生成一个计数器:
var num = 0;
function fn(){
num++;
console.log(num);
}
fn();
fn();
fn();
如果我们给num重新赋值
var num = 0;
function fn(){
num++;
console.log(num);
}
#num = 5;
fn();
fn();
fn();
如何保证num不被 污染?
使用闭包
function fn(){
var num = 0;
return function(){
num++;
console.log(num);
}
}
var fn1 = fn();
var num = 6;
fn1();
fn1();
fn1();
function fn(){
var num = 0;
return function(){
num++;
console.log(num);
}
}
var fn1 = fn();
fn1();
fn1();
fn1();
var fn2 = fn();
fn2();
fn2();
fn2();
console.log(fn1 == fn2);
闭包的缺点:
滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量
因为垃圾回收机制,只会回收变量。清空没用被调用函数的作用域
只要形成闭包,作用域就不能被销毁,因为闭包存在的意义,就是保护闭包内的变量不被外部影响
如果将函数内部的变量return出来,只是return出来这一个值
而闭包,return的是,整个闭包函数的作用域,提供给外部使用,依旧保持函数内部结构
闭包形成条件:
函数嵌套函数,内部函数使用外部函数的变量,此时就形成了闭包,内部的函数就是闭包,闭包内的变量和参数都不会被回收
大白话: 父亲养了个儿子,儿子来使用父亲的财产,此时就形成了闭包,儿子使用的这个财产,不会被收回,因为儿子一直在占用着这个财产。财产被销毁的条件,父亲没有用了,但是,儿子一直要用父亲的财产,就导致,父亲一直有用
因为闭包永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数
想要释放的时候,给该闭包函数,赋一个null值