什么是作用域和作用域链?

264 阅读1分钟

作用域:又叫变量作用域,是指变量作用的范围。

js中,有三种作用域

  1. 全局作用域(Script):页面任何地方都可以使用;他是全局变量,是在大括号外面声明的。

  2. 局部作用域(Local) : 只能在函数内部使用;他是局部变量,是属于函数内部声明的变量,这里要注意,形参也是局部变量,不过全局定义的函数却是全局变量。

  3. 块级作用域(Block):在大括号(分支 + 循环)里面声明的变量

<script>
        

    //全局变量 
    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)
    }


</script>

作用域链:默认情况下,js代码处于全局作用域(顶级作用域:0级),当我们声明一个函数的时候,会开辟一个局部作用域(1级)。如果在局部作用域中又声明一个函数,就会形成新的局部作用域(2级),以此类推,就形成了链式结构,称之为作用域

//全局作用域 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()

变量访问作用域链的规则:就近原则。就是如果自己的作用域有声明这个变量,就在自己的作用域找这个变量的值,如果没有,就访问上级作用域,如果有就访问,还没有就继续找,一直到最顶级(0级),还是找不到就会报错 xxx is not defined,这个变量没有定义。