zoukankan      html  css  js  c++  java
  • 函数体中的全局变量与局部变量

    首先看一道笔试题:

    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;

  • 相关阅读:
    【SQL触发器】类型 FOR 、AFTER、 Instead of到底是什么鬼
    Oracle两种临时表的创建与使用详解
    oracle 临时表(事务级、会话级)
    oracle存储过程游标的使用(批号分摊)
    delphi FastReport快速入门
    Vue 表情包输入组件的实现代码
    一个基于 JavaScript 的开源可视化图表库
    浅淡Webservice、WSDL三种服务访问的方式(附案例)
    记录一下遇到的问题 java将json数据解析为sql语句
    Oracle词汇表(事务表(transaction table)”)
  • 原文地址:https://www.cnblogs.com/xiaozhumaopao/p/4763843.html
Copyright © 2011-2022 走看看