闭包的含义 :函数本身就是闭包, 函数可以记住自已定义时所处的外部环境 , 和内部语句, 这就是闭包
案列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中 X
console.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=2
var 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>