彻底搞清JavaScript的变量作用域

资料来源于网络:

    变量的作用范围又称为作用域,是指某变量在程序中的有效范围。根据作用域,变量可以分为全局变量和局部变量。
1  全局变量的作用域是全局性的,即在整个JavaScript程序中,全局变量处处使用。
2  而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用。
    在函数内部,局部变量优先级比同名的全局变量优先级如果存在与全局变量名称相同的局部变量,或者在函数内部声明了与全局变量同名的参数,那么,该全局变量将不再起作用

如例1:

<script language="javascript" type="text/javascript">
<!--
 var a = "我是一个全局变量";
 function check()
 {
      var a = "我是一个局部变量";
      document.write(a);
 }
 check();
//-->
</script>

 输出:我是一个局部变量

 

    虽然在全局作用域中可以不使用var声明变量(没有声明的变量会被编译成全局变量),但在作为局部变量时,一定要使用var语句声明变量。一般情况下,函数并不知道全局作用域中定义了什么变量,也不知道这些变量的作用。如果函数使用的是全局变量,而不是局部变量,那么它将改变全局变量的值。因此,最好在声明所有变量时都使用var语句。
       JavaScript没有块级作用域,函数中声明的所有变量无论是在哪里声明的,在整个函数中都有意义。在下面代码中,变量i,j,k作用域相同,在整个函数体中都有意义。

看例2:

<script language="javascript" type="text/javascript">
<!--
 function check()
 {
         var i = 0;
         if(i == 0)
         {
                var j = 1;
                for(var k = 0;k < 1;k ++)
               {
                      document.write("k在循环体内的值为:" + k + "<br />");
               }
               document.write("k在循环体内的值为:" + k + "<br />");
         }
        document.write("j在if语句外的值为:" + j);
 }
 check();
//-->
</script>

输出:

k在循环体内的值为:0
k在循环体内的值为:1
j在if语句外的值为:1

 

思考:

一直我的困惑问题,如例1:

1.声明了全局变量后,在函数怎么使用全局变量

2.函数怎么识别他是不是全局变量

    之所以产生以上两个疑问,因为看过很多资料之后,越看越糊涂。后来看了这篇资料后,才顿悟!其实道理很简单,在使用同名局部变量后,同名全局变量就被覆盖。不知道是我理解不够,还是有些文章语句生硬,或者是根本没有表述清楚,强烈建议技术书籍尽量使用短句,平实的语句。

 

自解疑惑:

例2:

<script language="javascript" type="text/javascript">
<!--
 var a = "我是一个全局变量";
 function check()
 {     
     alert(a);
//a += "我是一个局部变量";
     // document.write(a);
 }
 check();
//-->
</script>

输出:我是一个全局变量

 

例3:

<script language="javascript" type="text/javascript">
<!--
 var a =4
 function check()
 {
     alert(a);
     var a=5;
 }
 check();
//-->
</script>

输出:undefined

分析:这里的undefined其实相当于null,因为 var a=5;作用在整个函数体内,全局变量不起作用,此时属于没有声明就使用了变量。

 

例4: 

<script language="javascript" type="text/javascript">
<!--
 a =4
 function check()
 {
     alert(a);
  }
 check();
//-->
</script>

输出:   4

分析:对于从未声明过的对象,如果尝试给它赋值,会隐式的将它声明为全局对象

例5: 

<script language="javascript" type="text/javascript">
<!--
 function check()
 {
     alert(a);
  }
 check();
//-->
</script> 

 结果:不会弹出对话框,会报错

结果分析:

在IE里,如果尝试读一个未声明的对象,会报错,有时候在一些复杂的程序里面,会报错,但是不能保持报错的状态,当然也不会继续执行JS。这点其实挺要命,不执行也不告诉你错在哪儿。

因此,写法如下是经常容易犯错误:

if(!a) {
//do sth. ...
}

这样写有时候的初衷是:如果变量a不存在,就执行里面的语句。但如果a未定义,在Firefox中会报错;在IE里不会报错,但也不会执行以后的所有语句。

 

所以该如何探测一个变量是否被定义呢?一个巧妙的办法是:

if(!window.a) {
//do sth. ...
}

这个方法其实很奇妙,因为读一个未声明的变量,会报错;但读一个未声明的属性,就不会报错。天晓得JS为啥规定这样奇怪的语法。

但是这样的方法只适用与全局变量。若是某个函数里的局部变量,还是用typeof去判断吧:

if(typeof a == 'undefined') {
//do sth. ...
}

例5:

  <script language="javascript" type="text/javascript">
<!--
 function b()
{
    alert(i);
    //i=3;
}

function a()
{
    var i = 4;
    b();
    alert("i="+i);
}
a();
//-->
</script>

 

输出结果为:undefined

i作为局部变量,它只在函数a内起作用,尽管函数b()也在函数a()内,但在函数b()内不起作用。

 

最后终结:

              不要在变量未定义之前使用它

              不要在条件语句中声明变量

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值