作用域、作用域链到底是怎么回事?

作用域

它是指对某一变量和函数具有访问权限的代码空间
在js中只有两种作用域
1.全局作用域:script标签内部的区域就是全局作用域
2.局部作用域:函数大括号内部的区域就是局部作用域
在js中只有函数可以划分作用域,因此每个函数的大括号内部都是一个局部作用域
因此我们称局部作用域为函数作用域

  1. 全局变量 声明在全局的变量
  2. 全局作用域就是全局变量起作用的范围
  3. 局部变量 在函数内部声明的变量
  4. 局部作用域就是局部变量起作用的范围
    <script>
    	  //script标签中的空间就是全局作用域
         //全局作用域
         //a变量就声明在了全局作用域,就是一个全局变量
        var a;  //全局变量
        a(a)
        a = 10;
        function a(a) {
    
    
            //函数大括号内局部作用域
            //在函数内部声明的变量就是局部变量
            let b = 10;//局部变量
            console.log(a)
            a = 100
        }
        console.log(a)
        console.log(b) //b is not defined
        var c;
        console.log(c)//undefined
    </script>

不同作用域中变量和函数的访问权限

  1. 局部作用域中声明的变量和函数只能在局部作用域中访问
  2. 全局作用域中声明的变量和函数可以在全局任意访问
  3. 两个同级的布局作用域之间不能互相访问对方内部的变量
  4. 全局作用域不能访问局部里面的变量

由以上几条推出

  1. 子级作用域能访问父级作用域的变量和函数
  2. 父级作用域不能访问子级的变量和函数
  3. 同级作用域之间不能互相访问变量和函数

作用域链

会先在当前作用域查找变量,当前没有向上一级查询
1.当前有使用当前的变量。
在这里插入图片描述
首先,函数不调用不执行,所以调用了fun函数,在fun函数中,有一个函数a,调用了函数a,打印了a,调用a会执行a函数,里面var了一个a赋值为10,所以在函数a中打印a出的结果为10,在fun函数中打印a的结果是函数a这个函数体。

2.当前没有向上一级查找变量,一直到全局作用域为止,如果还是没有会报错,xxx is not defined。

 var c = 100;//全局作用域中有c
        function num(b) {
    
    
        //上一级函数局部作用域也没有c
            var a = 10;
            function sum() {
    
    
                console.log(a + b + c) //当前函数局部作用域没有c
            }
            sum()
        }
        // num(10)  //10+10+100
        num(10)  //120

猜你喜欢

转载自blog.csdn.net/qq_43291759/article/details/109512388
今日推荐