欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS中的全局变量和局部变量,和声明提升

程序员文章站 2024-02-15 12:05:23
...

在解释全局变量和局部变量之前,先说一个js中的变量搜索顺序:找变量时,先找局部变量,如果没有局部变量;再找全局变量。

如何查找全局变量

  1. 最外层的函数和和最外层函数外面的变量都是全局变量。

    因为函数是可以嵌套的,所以找全局变量时,要找最外层函数;而且函数本身也是一个变量,特殊变量,其名字就是变量名。

  2. 没有用 var声明的变量,为全局变量,即使位置在函数体内部。

  3. 所有Window对象的属性也是全局变量。
 var v = "hello"; //函数体外的变量,全局变量
 var a = 100 
     b = 10; //b也是全局变量
    function test (){
    v="11";  //没有用var声明的变量,全局变量
        console.log(v);
        var v = "world"; //函数体内部的变量,局部变量
    }
    test();

详细解释,各种情况

 var v = "hello";
    var a = 100
    b = 10;
    console.log(a);

    function test() {
        console.log(b);
        var v = "world";
    }
    test();
  1. var a = 100
    b = 10;

    连续赋值,等同于 var a=100; b=10; b为没有var声明的全局变量 。元素中间用换行, 不然要报Uncaught SyntaxError: Unexpected identifier。

  2. 没有用var定义的全局变量,作用1、是为声明定义过的变量,重新赋值;不管是全局变量,还是局部变量。2、作为定义的变量。位置不管在全局或者局部,在局部时,一定要在输出(使用)前,定义好。(个人理解,如果读者有更好的了解或者觉得我的解释有误,可以留言)

JS中的全局变量和局部变量,和声明提升

  1. 函数内部的this指针指向,调用函数的调用者。
    var v = "hello";
    function test() {
        var v = "world";
        console.log(this.v);
    }
    test();

输出结果是hello。test()函数在此列子中为全局变量,所以调用它的为window,this.v等同于window.v。输出时,会去查找,属于window的变量。 var v = “hello”;为全局变量是属于window的。

知识点提升
变量和函数的声明提升:也叫预解析机制

    var v = "hello";
    function test (){
        console.log(v);
        var v = "world";
    } 
    //上述代码等同于
        var v = "hello";
        function test (){
        var v;  //提升变量声明
        console.log(v);
        v = "world";
    }

所以输出是undefined。

变量的提升:js执行过程中,遇到变量,会将变量声明提升到函数的第一行,只是提升声明,而不能赋值。

在代码中是禁止出现单独的元素变量的:var a=1;或者是a=1;或者是var a是可以的;但 绝对不能单独出现 a。前面两种是已经声明,并有确定的值。

var a;是定义了,但没有赋值,输出时会输出undefined。而单独出现的a,直接报test.html:18 Uncaught ReferenceError: a is not defined。这两者是不一样的,undefined是数据类型,而后者是活生生的错误。

    <script>
    var v = "hello";
    function test() {  
        v = "world";
        console.log(v);
        var v = "gaega";
        console.log(test1());
        function test1() {
            return 2;
        }
    }
    test();
    </script>

JS中的全局变量和局部变量,和声明提升

输出为:world,2

函数的声明提升:执行js代码时,预解析机制,会将代码中的所有函数按照包裹关系列出来,只是我们不知道而已。当调用时,再去查,是否定义了该函数。如果定义了,就执行函数;没有定义就报错。强调强调:预解析时只是知道有该函数,而不去执行该函数。所以在js中,调用语句可以写在函数定义之前。这种情况在其他语言中是没有的。

补充:
在js中是允许用相同的变量名的,这种情况在其他语言中是没有的。

 <script>
    var v = "hello";

    function test() {
        var v = "11";
        console.log(v); //输出11
        v = "33";
        var v = "22";
        console.log(v);  //输出22

    }
    test();
    </script>

变量赋值是从左到右的:

    <script>
    var a = 100;

    function test() {
        var a = 10;
        a = 1;
        console.log(a);
    }
    test();
    </script>

上述代码的执行步骤:

  1. var a;
  2. a=100;
  3. test();
  4. 进入函数体内
  5. var a;
  6. a=10;
  7. 当执行a=1;之前a都为10;
  8. a=1;
  9. console.log(a);

在Google 中调试代码,观察代码执行顺序

JS中的全局变量和局部变量,和声明提升