JS作用域及作用域链

97 阅读1分钟

一、作用域

概念:作用域是在程序运行时代码中的某些特定部分中变量、函数和对象的可访问性。

分类: 在JavaScript中,作用域分为全局作用域函数作用域(局部作用域)

函数作用域:在固定的代码片段才能被访问

例如:

<script>
    let a = 10,
        b = 20;

    function fn() {
        let c = 111,
            d = 222;
        console.log(c, d);

        function fn2() {
            let a = 1111,
                d = 2222;
            console.log(a, d);
        }

        fn2();
    }
    console.log(a, b);
    fn();
</script>

image.png

作用域有上下级关系,上下级关系的确定就看函数是在哪个作用域下创建的。

作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突

总结:作用域就是代码的执行环境,全局作用域就是全局执行环境,函数作用域就是函数的执行环境,它们都是栈内存

二、作用域链

概念:多个作用域对象连续引用形成的链式结构。

一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链

例如:

<script>
    let a = 10,
        b = 100;

    function fn() {
        let b = 20;

        function fn2() {
            console.log(a + b);
            /*fn2函数局部作用域中没有变量a,于是从它的上一级,也就是fn函数中查找,发现fn也没有
              然后在上一次 全局作用域中a呗赋值为10,于是输出的是10 
              而变量b呢在fn2中没有,于是找到它的上一级 fn fn函数中b被赋值为20,于是输出20
              故而 a+b = 10+20
            */
        }

        fn2();
    }

    fn();
</script>

image.png