作用域和作用域链

90 阅读1分钟

作用域

作用域就是变量的有效范围。 在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域。

  1. 全局作用域(Script): 最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的。

  2. 局部作用域(Local): 局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部。在 ES6 之前,只有函数可以划分变量的作用域,所以 在函数的外面无法访问函数内的变量。

  3. 块级作用域(Block):凡是代码块就可以划分变量的作用域,这种作用域的规则就叫块级作用域。

    //全局变量 
        let num = 10

        //fn本身还是全局变量
        function fn(a,b) {
            //函数 : 局部作用域
            let age = 20
            console.log(age)
        }

        fn(10,20)

        //块级作用域: 分支 + 循环
        for (let i = 1; i <= 5; i++) {
            console.log(i)
        }

        for(let i = 1;i<=10;i++){
            console.log(i)
        }

作用域链

  • 在子级作用域中依次向上级作用域中链式查找变量,称之为作用域链;如果全局都没有则会报错;
  • 作用域链的最顶端是变量的当前执行环境,依次向下查找变量,最底部是window
    //全局作用域 0级
        let num = 10
        
        function fn(){
            //局部作用域 1级
            // let num = 20
            console.log(num)//20
            
            function fn1(){
                //2级
                // let num = 30
                console.log(num)//30
            }
            fn1()
        }

        console.log(num)//10
        fn()