变量的作用域指的是,变量起作用的范围。也就是能访问到变量的有效范围。

JavaScript的变量依据作用域的范围可以分为:

  • 全局变量

  • 局部变量


一. 全局变量

==定义在函数外部的变量都是全局变量。==

全局变量的作用域是当前文档,也就是当前文档所有的JavaScript脚本都可以访问到这个变量。

下面的代码是书写在同一个HTML文档中的2个JavaScript脚本:

<script type="text/javascript">
//定义了一个全局变量。那么这个变量在当前html页面的任何的JS脚本部分都可以访问到。
var v = 20;
alert(v); //弹出:20
</script>
<script type="text/javascript">
//因为v是全局变量,所以这里仍然可以访问到。
alert(v); //弹出:20
</script>

再看下面一段代码 :

<script type="text/javascript">
alert(a);
var a = 20;
</script>

运行这段代码并不会报错,alert(a); 这行代码弹出:undefined。

为什么在声明 a 之前可以访问变量 a 呢? 能访问 a 为什么输出是undefined而不是20呢?

声明提前!

  • 所有的全局变量的声明都会提前到JavaScript的前端声明。也就是所有的全局变量都是先声明的,并且早于其他一切代码。
  • 但是变量的赋值的位置并不会变,仍然在原位置赋值。

所以上面的代码等效下面的代码:

<script type="text/javascript">
var a; //声明提前
alert(a);
a = 20;    //赋值仍然在原来的位置
</script>

二. 局部变量

在函数内声明的变量,叫局部变量!

表示形参的变量也是局部变量!

局部变量的作用域是局部变量所在的整个函数的内部。

在函数的外部不能访问局部变量。

<script type="text/javascript">
    function f(){
        alert(v);  //    弹出:undefined
        var v = "abc";  // 声明局部变量。局部变量也会声明提前到函数的最顶端。
        alert(v);    //    弹出:abc
    }
    alert(v);  //报错。因为变量v没有定义。 方法 f 的外部是不能访问方法内部的局部变量 v 的。
 </script>

三. 全局变量和局部变量的一些细节

看下面一段代码:

<script type="text/javascript">
    var m = 10;
    function f(){
        var m = 20;
        alert("方法内部:" + m);  //代码1
    }
    f();
    alert("方法外部:" + m);    //代码2
</script>

在方法内部访问m,访问到的是哪个m呢?局部变量的m还是全局变量的m?

全局变量和局部变量重名问题

  1. 在上面的代码中,当局部变量与全局变量重名时,局部变量的作用域会覆盖全局变量的作用域。也就是说在函数内部访问重名变量时,访问的是局部变量。所以 "代码1" 部分输出的是20。

  2. 当函数返回离开局部变量的作用域后,又回到全局变量的作用域。所以代码2输出10。

  3. 如何在函数访问同名的全局变量呢?==通过:window.全局变量名

<script type="text/javascript">
    var m = 10;
    function f(){
        var m = 20;
           alert(window.m);  //访问同名的全局变量。其实这个时候相当于在访问window这个对象的属性。
    }
    f();  
</script>
Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-10-18 03:19:29

results matching ""

    No results matching ""