Bootstrap

什么是闭包?什么是作用域?什么是作用域链?

闭包:函数嵌套函数。

说到闭包,就不得不说作用域作用域链。

作用域:变量的适用范围。

作用域链:如果要查找一个变量,它会一层一层的往上找,找到就返回,找不到继续向上找,如果没找到就返回undefined.

闭包:函数嵌套一个函数    或者说     函数返回一个函数 ;
在外层可以访问内层的作用域(外部的函数可以访问内部的变量)   这就是闭包.

function fn1() {
    var age = 10;
    debugger
    return function fn2() {
         return age;
   }
}

console.log(fn1()());           // 10

 作用域:
        var msg = '你今天快乐吗?';
         console.log(msg); */           // 你今天快乐吗?

作用域链:
         作用域的运行机制:        采用就近原则机制

         它会找到最近的变量,如果找不到,就往上一层找,
         如果还找不到,继续向上一层找,直到浏览器给我们报错.        // a is not defined
         
         当我们在局部作用域中,访问一个变量时,系统首先会在当前作用域中寻找变量var的声明语句,
         如找到则直接使用.反之,则继续向上一级作用域中寻找var的声明语句,
         如找到则直接使用,反之,继续向上一级作用域中去寻找…直到全局作用域,
         最后找不到的话就会给我们一个报错。

作用域链代码演示:

尝试注释掉每一个变量a

        var a = '小强';
        function fn1() {
            var a = '小明';
            console.log(a);
                    function fn2() {
                        var a = '小白';
                        console.log(a);
                    }
                 fn2();
         }
        fn1(); 

最后总结一下哈:闭包的好处和它的一个坏处:

好处:它不仅可以访问内部的变量,变量不会污染;

坏处:当前变量会一直保存,容易造成内存泄漏

举个例子吧,咱们vue里面中的data就是一个闭包:       

data:function(){}

data作为一个函数,可以保证数据不会污染

;