1、定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。(关于概念博主摘抄以上几点,详情查看 百度百科)
    2、表现形式:使函数外部能够调用函数内部定义的变量。
    案例1:根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显变量a 是函数内部的fun 的那个变量a 。

    1. <script>
    2. function create() {
    3. let a = 100;
    4. return function () {
    5. console.log(a);
    6. }
    7. }
    8. let a = 200;
    9. let fn = create();
    10. fn();//100
    11. // 自由变量的查找,是在定义函数的地方,向上级作用域查找。而不是在函数执行的地方查找。
    12. function print(fn){
    13. let a = 200;
    14. fn();
    15. }
    16. let a = 100;
    17. function fn(){
    18. console.log(a);
    19. }
    20. print(fn)//100
    21. </script>
    1. <script>
    2. function createCache() {
    3. const data = {};
    4. console.log(this);
    5. return {
    6. set: function (key, val) {
    7. data[key] = val;
    8. },
    9. get: function (key) {
    10. return data[key];
    11. }
    12. }
    13. }
    14. var obj = createCache(); //触发函数
    15. obj.set("name", "liming")
    16. console.log(obj.get('name'));
    17. // 1 隐藏数据,让数据不被外部访问 应用场景:vue-hook,vue-setup,想设置一个变量,不污染全局。
    18. /*
    19. 特点:
    20. 1.函数的嵌套
    21. 2。内部函数使用外部函数的变量
    22. 3.内部函数作为外部函数的返回值
    23. */
    24. /*
    25. 缺点:
    26. 局部变量常驻内存,容易造成内存泄露。
    27. */
    28. </script>