看了这个你还不懂作用域和作用域链??

75 阅读1分钟

JavaScript作用域

定义: 简单理解就是代码(变量/函数)在某个范围内起作用和效果,作用域的目的是为了提高程序的可靠性更重要的是减少命名冲突。

js的作用域:

  1. 全局作用域:
    1. 任何不在函数或者大括号中声明的变量,都在全局作用域下
    2. 全局作用域下声明的变量可以在程序中任何位置访问
  1. 函数作用域:函数作用域中定义的变量,只能够在函数内部访问,不能在函数外部访问
  2. 块级作用域:let 和 const 定义的变量在我们的 { } 外面不能被访问到

下面我们用一些代码来看一下

 <script>
        //此时声明的是一个全局变量,这个变量a作用于全局。
        var a = 10;
        console.log(a); //输出结果是10

        function demo() {
            //此时声明的是一个作用于demo()这个函数的变量b。变量b的作用范围就是demo()函数的花括号内
            let b = 15;
            console.log(b);  // 结果是10
        }
        console.log(b);  // 注意,此时输出b就会报错,因为b只作用于函数内部

        {
            let c = 11;  //声明了一个作用于 { } 内的变量c
            const d = 22; //const也作用于 { } 内
            var e = 33  //注意这里使用的是var
            console.log(c, d, e);
        }

        console.log(c, d, e);  //这里输出就会报错说c没有找到。
    </script>

js作用域链

  1. 定义: 在我们的 js 中使用一个变量,我们的 js 引擎会在当前作用域查找,如果没有找到,就会去上一层作用域查找,以此类推,直到找到变量或者到达全局作用域。如果没有找到变量,直接报错或者隐式声明。那么这么一个寻找的路径我们就叫做作用域链。

简单举一个例子

 <script>
        let out = "你好!";
        function demo() {
            let sex = "Man";
            function demo01() {
                let myName = "小趴菜";
                let age = 21;
                console.log(myName, age);
                // 在当前作用域可以找到,所以输出结果为:小趴菜, 21
                console.log(sex, out); 
                // 当前作用域没有这个变量,会向上查找,向上查找时有这个变量,输出结果为:Man,你好!
            }
            demo01()
            console.log(sex);
            // 在当前作用域可以找到,所以输出结果为:Man
            console.log(myName, age);
            // 在当前作用域找不到,所以会报错
        }
        demo()
    </script>