Javascript的全局变量和局部变量

JavaScript有两种变量:局部变量和全局变量。

    首先,局部变量是指只能在本变量声明的函数内部调用。全局变量是整个代码中都可以调用的变量。当然,只是从字面的上的理解肯定理解不清楚。下面咱们用代码来真正的理解一下。

    在JavaScript中变量是需要用var关键字声明的。但是JavaScript中也可以不用声明,直接使用。因为在JavaScript中的变量是

弱类型(java中的变量是强类型,所以变量需要进行声明)。但是在JavaScript中把声明的变量当做全局变量来使用的。

例子:

1.

    <script language="javascript">
    function my_name() {
     i = '小猪佩奇';
              }
        my_name();
    function my_Name() {
     alert(i);
              }
    my_Name();
  </script>

输出:小猪佩奇

这说明变量i就是全局变量,虽然在不同的函数中但是也可以进行调用弹出。那如果进行下面修改就不一样了》

2.

<script language="javascript">
    function my_name() {
     var i = '小猪佩奇';
              }
        my_name();
    function my_Name() {
     alert(i);
              }
    my_Name();
  </script>

在这个程序中就不会有输出,因为在这个时候  i  就是人家my_name函数中的变量,也就是局部变量。而你在函数my_Name中调用,这就不可以的。

3.我们进行下面的修改:

<script language="javascript">
    function my_name() {
     i = '小猪佩奇';
              }
        
    function my_Name() {
     alert(i);
              }
    my_Name();
  </script>

咱们把my_name();去掉,此时浏览器也不会有反应,因为虽然  i  是全局变量但是函数my_name()没有进行调用,所以就是相当是声明了  i  但是没有进行赋值,所以也就没有任何输出。

4. 那咱们在进行如下的修改:

<script language="javascript">
    var i="佩奇弟弟乔治"
    function my_name() {
     i = '小猪佩奇';
          }

    my_name();

    function my_Name() {
     alert(i);
              }
    my_Name();
      </script>

这次的输出是:小猪佩奇   原因就是全局变量  i  的起始值是“佩奇弟弟乔治”但是经过函数my_name的再次赋值,就变成了小猪佩奇,所以在弹出的时候就是小猪佩奇了。

5.在变一下:

<script language="javascript">
    var i="佩奇弟弟乔治"
    function my_name() {
        var i = '小猪佩奇';
          }
   my_name();
    function my_Name() {
     alert(i);
              }
    my_Name();
    
my_name();
</script>

那,这次的结果就不是“小猪佩奇”了  就变成 “佩奇的弟弟乔治”。为什么呢,就是因为其实这两个  i  就是不一样的,第一个  i 是全局变量  但是第二个  i  就是局部变量了,它只在函数my_name中可以调用,在函数my_Name中的调用时对全局变量  i 的调用。

6. 那在变成这样,

<script language="javascript">
    var i="佩奇弟弟乔治"
    function my_name() {
      i = '小猪佩奇';
          }
   
    function my_Name() {
     alert(i);
              }
    my_Name();
    my_name();
  </script>

这次就是  佩奇的弟弟乔治   因为这次首先是   对函数my_Name进行调用,在对函数my_name进行调用,所以弹出的  i 就是:佩奇弟弟乔治

大概变量就只有这么多的内容,虽然很简单 ,但是有一丢丢的绕,好好看一下 ,肯定能很好地认知到。



### 全局变量局部变量同名的作用域优先行为分析 在编程语言中,作用域决定了变量的可见性生命周期。当全局变量局部变量同名,作用域规则会决定哪个变量会被优先使用。以下是关于全局变量局部变量同名的行为作用域规则的详细分析。 #### 1. 局部变量优先高于全局变量 当一个局部变量全局变量同名,在局部变量的作用域内,局部变量会**屏蔽**全局变量[^1]。这意味着在局部作用域中,程序将优先访问局部变量,而不会访问同名的全局变量。 例如,在C语言中: ```c #include <stdio.h> int a = 10; // 全局变量 int main() { int a = 20; // 局部变量 printf("局部变量a: %d\n", a); // 输出 20 return 0; } ``` 在上述代码中,`printf` 函数中的 `a` 是局部变量,因此输出结果为 `20` 而非全局变量的值 `10`[^1]。 #### 2. 访问被屏蔽的全局变量 尽管局部变量会屏蔽全局变量,但在某些语言中仍然可以通过特定的方式访问全局变量。例如,在C语言中,可以使用 `global` 关键字(虽然C语言本身没有直接的 `global` 关键字,但可以通过指针或明确指定地址来访问全局变量)[^3]。 以下是一个示例: ```c #include <stdio.h> int a = 10; // 全局变量 int main() { int a = 20; // 局部变量 printf("局部变量a: %d\n", a); // 输出 20 printf("全局变量a: %d\n", ::a); // 在C++中可使用 :: 操作符访问全局变量 return 0; } ``` 注意:在C语言中无法直接通过 `::` 操作符访问全局变量,但可以通过指针或其他方式间接访问。 #### 3. 变量提升对作用域的影响 在JavaScript等语言中,变量提升可能会导致同名变量的行为更加复杂。例如,如果在函数内部声明了一个全局变量同名的局部变量,但由于变量提升的原因,该局部变量可能在声明之前就已经存在,但未初始化,从而导致 `undefined` 的结果[^5]。 以下是一个JavaScript示例: ```javascript var val = 10; // 全局变量 function test() { console.log(val); // undefined,因为局部变量val被提升但未初始化 var val = 100; // 局部变量 console.log(val); // 100 } test(); ``` #### 4. 不同语言中的行为差异 不同编程语言对全局变量局部变量同名的行为处理可能有所不同。例如,在C语言中,局部变量会完全屏蔽全局变量;而在JavaScript中,变量提升可能导致未定义行为[^4]。 #### 5. 总结 - 局部变量的优先高于全局变量,在局部作用域内会屏蔽全局变量。 - 在某些语言中,可以通过特定方式(如C++中的 `::` 操作符)访问被屏蔽的全局变量。 - 变量提升可能会导致局部变量的行为更加复杂,尤其是在JavaScript等动态语言中。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值