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

在解释全局变量和局部变量之前,先说一个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、作为定义的变量。位置不管在全局或者局部,在局部时,一定要在输出(使用)前,定义好。(个人理解,如果读者有更好的了解或者觉得我的解释有误,可以留言)

这里写图片描述

  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>

这里写图片描述

输出为: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 中调试代码,观察代码执行顺序

调试代码

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值