一、闭包技术详解

1.1 什么是闭包

闭包就是大函数内部的小函数中,调用小函数外部(大函数内部)的参数

  • 闭包实际上是一种函数,所以闭包技术也是函数技术的一种;闭包能做的事情函数几乎都能做。

  • 闭包技术花式比较多,用法也比较灵活,一般开发人员在学习闭包的时候都会遇到瓶颈,主要是因为闭包技术的分界线并不明显。几乎无法用一个特点去区分。

  • 当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。

    function A(){ function B(){ console.log("Hello YJH!");} return B;
    }
    var b = A();
    b();//Hello YJH!
    
  • 闭包的最大用处有两个:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
    使用闭包返回函数,间接调用局部变量。

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body>
    <script>function test1() {var age = 19;   //局部变量}console.log(age);
    </script>
    </body>
    </html>
    

    运行结果:

    function test1() {var age = 19;   //局部变量return function () {console.log(age);   //返回一个函数}
    }
    var func = test1();
    func();
    

    运行结果:

1.2 常见的闭包使用形式

将函数作为另一个函数的返回值

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>function fn1() {var num = 10;function fn2() {num++;console.log(num)}return fn2;}var f = fn1();f();
</script>
</body>
</html>

可以在这里查看闭包


使用闭包最重要的意义:一个函数中的部分子函数在函数调用完成后仍希望保存,可以使用闭包将小函数作为大函数的返回值进行传输保存。
当引用的变量无用时,需要及时删除闭包,不然会造成资源浪费。令保存闭包的全局变量=null,即可让闭包变成垃圾对象删除。

将函数的形参作为实参传递给另一个函数调用

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script type="text/html">// 1.  将函数作为另一个函数的返回值function fn1() {var num = 10;function fn2() {num++;console.log(num)}return fn2;}var f = fn1();f();
</script>
<script>// 2.将函数的形参作为实参传递给另一个函数调用function logMsgDelay(msg, time) {setTimeout(function () {debugger;console.log(msg);}, time);}logMsgDelay('Joker',1000);
</script>
</body>
</html>

1.3 封闭作用域

JavaScript的GC机制

在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收,否则这个对象一直会保存在内存中。

封闭作用域

  • 封闭作用域又称值为封闭空间,还有一个昵称叫小闭包,以及匿名函数自调。

  • 基本结构:

    (function(){})();
    ;(function(){})();
    +(function(){})();
    -(function(){})();
    ?(function(){})();
    
  • 技法最大目的: 全局变量私有化

  • 技术优点:

  1. 不污染全局空间!
  2. 内部所有的临时变量执行完毕都会释放不占内存。
  3. 可以保存全局数据。
  4. 更新复杂变量。

1.4 作用域链