闭包的含义 :函数本身就是闭包, 函数可以记住自已定义时所处的外部环境 , 和内部语句, 这就是闭包
案列1
//function outer() {var a = 10;function inner() {console.log(a);}//inner 没有小括号 , 表示定义语句return inner;}var i = outer(); i();//结果 10
案列2
function outer() {var a = 10;function inner() {console.log(a);}return inner();}outer();//结果 10
闭包是函数天数天生存在的性质 , 不需要任何结构, 只不过我们需要借助这种形式体会到闭包.
<script>//形参 是局部变量function outer(x) {function inner(y) {//当前作用域没有X的定义, 使用outer中 Xconsole.log(x + y);}//返回inner 定义return inner;}//将outer 调用赋值给i , 相当于将inner 定义赋值的i//类是于把inner拿到外部使用, 能够记住自已定义时所处的外部环境x=10//类是于把inner拿到外部使用, 能够记住自已定义时所处的内部环境console.log(x + y)// I = function inner(y) { console.log(10+ y);}var i = outer(10);i(20, 30, 40);// console.log(i);//声明一次函数 I 可以多次调用i(100);</script>
2
<script>//闭包: 函数能够记住定义的外部环境和内部语句function outer(x, y) {function inner(y) {// 作用域链 根据就近原则console.log(y);console.log(x + y);}//调用outer(x,y) 返回的事inner 函数return inner;}//i赋值的事inner 函数//outer(1,2) X=1 , y=2var i = outer(1,2);//i是inner函数名字 ,调用i函数 i的实际参数是赋值给inner 函数 y//i(10) 调用, 能够记住x=1 , 还可以内部语句console.log(1+y)i(10);i(20);</script>

闭包并不是一成不变的, 函数的每一次调用,都会产生全新的闭包,
<script>//闭包: 函数能够记住定义的外部环境和内部语句function fun1() {var a = 10;function fun2() {a++;console.log(a);}//调用fun1 返回的事fun2的定义return fun2;}//每一次fun1调用都产生一个全新的闭包, 之间互不影响var inn1 = fun1();var inn2 = fun1();//闭包 的外部环境不是一成不变的 能够记住当前的新值 ,并且参与计算inn1();inn1();inn1();//每一次fun1 调用都产生全新的闭包,inn1 和inn2 闭包互不影响//每一个闭包,外部环境时全新的内部语句也是全新的inn2();inn2();inn1();</script>

