• 函数体中的全局变量与局部变量


    首先看一道笔试题:

    1 var a = 100;    
    2 function testResult(){    
    3   var b = 2 * a;    
    4   var a = 200;    
    5   var c = a / 2;    
    6   alert(b);    
    7   alert(c);    
    8  }    
    9  testResult();

    输出结果为:NaN和100;

    因为当全局变量和局部变量同名的时候,全局变量是不会主用于同名局部变量的作用域的。也就是说var a=100是不会作用于testResult这个函数中的。

    1.全局变量和它的作用域
      全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况:
    (1)在全局变量和局部变量不同名时,其作用域是整个程序。
    (2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。

    但是区别与下面的代码,当函数中不使用局部变量a时,使用的是函数体外部的全局变量a:

    1 var a = 100;
    2 function testResult(){
    3    var b = 2 * a;
    4     var c = a / 2;
    5    alert(b);
    6     alert(c);
    7  }
    8 testResult();

    输出结果为:200 50;

    另外要注意变量声明的影响:

    1 var a = 100;
    2 function testResult(){
    3     alert(a);
    4     var a=40;
    5     alert(a);
    6  }
    7 testResult();

    输出的结果是undefined和40;函数体中声明并定义了局部变量var a=40;覆盖了全部变量a=100;但是在函数体中的第一行只是声明了变量a尚未赋值给a,所以alert出undefined。第4行代码相当于两行代码:var a;a=40;即声明变量加赋值变量。因此第3行代码会根据声明变量而有效。

    1 var a = 100;
    2 function testResult(){
    3     alert(a);
    4     a=40;
    5     alert(a);
    6  }
    7 testResult();
    8 alert(a);

    将函数中的a改为全局变量,由于函数中没有声明,程序运行到第3行时,尚未运行到第4行,所以使用的是第1行的全局变量a=100;另外函数体中定义了全局变量a=40,之后的a也变为40;

    1  function testResult(){
    2          alert(a);
    3          a=40;
    4          alert(a);
    5       }
    6  testResult();
    7  alert(a);

    如上,如果外部没有全局变量,且函数中没有对a进行声明,则会导致错误,即a没有定义undefined!

    综上所述,函数体中如果有var声明变量,则会将声明提前,导致局部变量覆盖外部全局变量;如果没有var声明,则函数体中定义的是全局变量,没有声明提前,运行到第3行时,会使用函数体外的全局变量!

    补充一点:函数的参数是通过传值传递的,不会通过引用传递:(通过传参可以替换函数体内的局部变量,作用域仅限于函数体内)

    1 var a = 100;
    2 function testResult(a){
    3     a+=10;
    4     return a;
    5  }
    6 alert(testResult(a));
    7 alert(a);

    输出结果是110和100;

  • 相关阅读:
    PowerDesigner中生成SQL SERVER2005字段注释 和导出图片的方法
    右键显示打开控制台
    dubbo 的 Protocol 类
    nacos 的 grpc
    shell 替换文本中 为空格,多行为本合并为一行
    gcc、python3、python性能分析工具安装
    kafka listeners和advertised
    Default Activity not found 问题解决
    使用Global Mapper计算kml中面状图形的面积
    jeecg-boot 报表组——折线图初始化显示部分图例,部分变灰
  • 原文地址:https://www.cnblogs.com/xiaozhumaopao/p/4763843.html
Copyright © 2020-2023  润新知