JavaScript有关作用域和预解析

Posted HzdWwZz"LJF

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript有关作用域和预解析相关的知识,希望对你有一定的参考价值。

作用域:使用范围


全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
除了函数以外,其他的任何位置定义的变量都是全局变量

局部变量:在函数内部定义的变量,是局部变量,外面不能使用

全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存

全局作用域:全局变量的使用范围

局部作用域:局部变量的使用范围

块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;

说明:js没有块级作用域,只有函数除外。

隐式全局变量:声明的变量没有var,就叫隐式全局变量

全局变量是不能被删除的,隐式全局变量是可以被删除的

定义变量使用var是不会被删除的,没有var是可以删除的

函数体的局部变量,外部无法访问,但是隐式全局变量可以被访问

<script>
    function f1() {
        var number=100;
    }
    f1();
    console.log(number);//Uncaught ReferenceError: number is not defined

    function f1() {
        number=1000;
    }
    f1();
    console.log(number);//1000
</script>

隐式全局变量可以被删除,全局变量不能被删除

<script>
var num=10;
delete  num;
console.log(num);//10
num2=20;
delete num2;
console.log(num2);//Uncaught ReferenceError: num2 is not defined
</script>

作用域链:

  <script>  
    var num=10;
    function f1() {
      var num=20;
      function f2() {
        var num=30;
        function f3() {
          var num=50;
          console.log(num);//50
        }
        f3();
      }
      f2();
    }
    f1();
  </script>

如果注释掉var num=50; 则会向外部作用域寻找num变量

<script>
    var num = 10;

    function f1() {
        var num = 20;

        function f2() {
            var num = 30;

            function f3() {
                //var num=50;
                console.log(num);//30
            }

            f3();
        }

        f2();
    }

    f1();
</script>

有关预解析:

 预解析:提前解析代码
 预解析:发生在解析代码之前
 预解析做什么事?
 把变量的声明提前了----提前到当前所在的作用域的最上面
 函数的声明也会被提前---提前到当前所在的作用域的最上面

比如:

<script>
    console.log(num);//结果是undefined
    var num=2;
</script>




<script>
    f1();//输出"执行了"
    function f1() {
        console.log("执行了");
    }
</script>



<script>
       f1();//调用
       var num=20;//这个变量的声明会提升到变量使用之前
       function f1() {
         console.log(num);//结果是undefined
         var num=10;
       }
</script>

预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面
函数中的变量只会提前到函数的作用域中的最前面,不会出去




以上是关于JavaScript有关作用域和预解析的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中作用域和预解析

关于作用域和预解析的不常见重要知识

作用域和预解析

JS的作用域和预解析

JavaScript之作用域,作用域链和预解析

作用域和预解析的问题