写在最前面

正文开始

  1. //例子
  2. function a() {
  3. function b(){
  4. var bbb = 234;
  5. console.log(aaa)
  6. }
  7. var aaa = 123;
  8. return b;
  9. }
  10. var glob = 100;
  11. var demo = a();
  12. demo();

首先这个函数在执行return b之后,函数就a执行完了,会销毁a的AO,,但是在销毁之前函数b被保存出来了,所以b的执行期上下文并没有被销毁。

所以b的AO、Go都被保存出来了

这样就形成了闭包,也可以这样说:内部函数被保存到了外部,一定形成闭包

  1. function a (){
  2. var num = 100;
  3. function b(){
  4. num ++;
  5. console.log(num);
  6. }
  7. return b;
  8. }
  9. var demo = a();
  10. demo();//打印101
  11. demo();//打印102

闭包的概念 : 当内部函数保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(内存占用)

内存泄露 : 举个例子….一个杯子…你往里面到的水越多,他的内存越少(同理,你内存占的越多,他的内存越少)

闭包的作用

  • 实现公有变量
    • 函数累加器
  • 可以做缓存(存储结构)
    • eater
  • 可以实现封装,属性私有化
    • Person()
  • 模块化开发,防止污染全局变量

1、累加器上述例子已经写了

2、可以做缓存(存储结构)

  1. function test(){
  2. var num = 100;
  3. function a(){
  4. num ++;
  5. console.log(num);
  6. };
  7. function b(){
  8. num --;
  9. console.log(num);
  10. };
  11. return [a,b]
  12. }
  13. var myArr = test();
  14. myArr[0]();//打印101
  15. myArr[1]();//打印100
  1. function eater(){
  2. var food = "";
  3. var obj ={
  4. eat : function(){
  5. console.log("i am eating" + food)
  6. },
  7. push : function (myFood){
  8. food = myFood;
  9. }
  10. }
  11. return obj;
  12. }
  13. var eater1 = eater();
  14. eater1.push('banana');
  15. eater1.eat();
  16. //打印出 i am eating banana

上面的这个例子我在eater1.push(‘banana’)之后就给了eater里面的foot = “”,变成了food = “banana”。我在执行eater1.eat()之后就变成了拿到food = “banana” ,他们操作的都是同一个闭包,所以打印出i am eating banana,这个foot就相当于一个隐式的存储结构一样,这个就是缓存的应用

给自己买个坑,属性私有化,在我写完对象之后在解释,模块化开发也一样

立即执行函数

此类函数没有声明,在一次执行后即释放。适合做初始化工作。

  1. function a(){
  2. }
  3. function b(){
  4. }

我定义两个函数,这两个函数除非等到我JavaScript执行完,否则这两个函数永远都不的释放,永远等待被执行,等待被执行就占空间。

作用 : 针对初始化功能的函数

  1. (function (aaa,bbb,ccc){
  2. var a = 234;
  3. var b = 123;
  4. var c = a+b;
  5. console.log(c)
  6. return c
  7. }(1,2,3))

执行完立即被销毁

  1. // 怎么去接收他
  2. var num = (function (aaa,bbb,ccc){
  3. var a = 234;
  4. var b = 123;
  5. var c = a+b;
  6. console.log(c)
  7. return c
  8. }(1,2,3))

立即执行函数有两种写法

  1. //第一种
  2. (function(){}());//w3c 建议第一种
  3. //第二种
  4. (function(){})();

扩展

只有表达式才可以被执行符号执行

  1. var test = function (){}()
  2. //也可以被执行
  3. + function test(){}()
  4. //也可以被执行 以此类推- !号也可以
  5. function test(){
  6. console.log(a+b+c+d)
  7. }(1,2,3,4)
  8. //不执行也不报错