写在最前面
正文开始
//例子
function a() {
function b(){
var bbb = 234;
console.log(aaa)
}
var aaa = 123;
return b;
}
var glob = 100;
var demo = a();
demo();
首先这个函数在执行return b之后,函数就a执行完了,会销毁a的AO,但是在销毁之前函数b被保存出来了,所以b的执行期上下文并没有被销毁。
所以b的AO、Go都被保存出来了
这样就形成了闭包,也可以这样说:内部函数被保存到了外部,一定形成闭包
function a (){
var num = 100;
function b(){
num ++;
console.log(num);
}
return b;
}
var demo = a();
demo();//打印101
demo();//打印102
闭包的概念 : 当内部函数保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(内存占用)
内存泄露 : 举个例子…一个杯子…你往里面到的水越多,他的内存越少(同理,你内存占的越多,他的内存越少)
闭包的作用
-
实现公有变量
- 函数累加器
-
可以做缓存(存储结构)
- eater
-
可以实现封装,属性私有化
- Person()
-
模块化开发,防止污染全局变量
1、累加器上述例子已经写了
2、可以做缓存(存储结构)
function test(){
var num = 100;
function a(){
num ++;
console.log(num);
};
function b(){
num --;
console.log(num);
};
return [a,b]
}
var myArr = test();
myArr[0]();//打印101
myArr[1]();//打印100
function eater(){
var food = "";
var obj ={
eat : function(){
console.log("i am eating" + food)
},
push : function (myFood){
food = myFood;
}
}
return obj;
}
var eater1 = eater();
eater1.push('banana');
eater1.eat();
//打印出 i am eating banana
上面的这个例子我在eater1.push(‘banana’)之后就给了eater里面的foot = “”,变成了food = “banana”。我在执行eater1.eat()之后就变成了拿到food = “banana” ,他们操作的都是同一个闭包,所以打印出i am eating banana,这个foot就相当于一个隐式的存储结构一样,这个就是缓存的应用
给自己买个坑,属性私有化,在我写完对象之后在解释,模块化开发也一样
立即执行函数
此类函数没有声明,在一次执行后即释放。适合做初始化工作。
function a(){
}
function b(){
}
我定义两个函数,这两个函数除非等到我JavaScript执行完,否则这两个函数永远都不的释放,永远等待被执行,等待被执行就占空间。
作用 : 针对初始化功能的函数
(function (aaa,bbb,ccc){
var a = 234;
var b = 123;
var c = a+b;
console.log(c)
return c
}(1,2,3))
执行完立即被销毁
// 怎么去接收他
var num = (function (aaa,bbb,ccc){
var a = 234;
var b = 123;
var c = a+b;
console.log(c)
return c
}(1,2,3))
立即执行函数有两种写法
//第一种
(function(){}());//w3c 建议第一种
//第二种
(function(){})();
扩展
只有表达式才可以被执行符号执行
var test = function (){}()
//也可以被执行
+ function test(){}()
//也可以被执行 以此类推- !号也可以
function test(){
console.log(a+b+c+d)
}(1,2,3,4)
//不执行也不报错