zoukankan      html  css  js  c++  java
  • javascript变量:全局?还是局部?这个得注意!

    做项目就是一个学习的过程!

    做为一个学习C3年多,从C程序员转前端的人来说,javascript中的许多规则是没办法或者说一时半会理解不了的。

    今天就遇到了一个,大致就是这么个代码。

    var a ;                         //全局变量
    function fun()
    {
        alert(a);               // a 在其它地方赋值,在这里操作,比如赋值为 0      ------------- 1
        if(a==0)
        {
           alert(a);        // ----------------2
           a = 10;
        }        
        var a = 5 ;          // 重新定义变量
        alert(a);             // -----------------3
    }    
    function fun2()
    {
        alert(a)            // ------------------4
    }
    //  先执行了赋值,然后执行fun(),执行fun2();

    结果第2处的操作怎么都进入不了,于是打出第1处直接 a 的值是: undefined !,我C,这是什么情况?

    可能是C的理论,在脑海里扎的太深了,想了很久也想不明白为什么,只好在网上查,还好不是我一个人遇到这样的问题,在网上查了三篇文章。

    javascript 变量范围
    
    (1)全局变量的作用域是全局性的,即在整个Javascript程序中,全局变量作用处处都存在。定义在”script”块中,在”function”函数外。
    (2)局部变量的作用域是局部性的,在函数内部或函数参数时定义,作用范围是从函数开始到结尾(注意此处说法)
    (3)在函数内部,局部变量的优先级比同名的全局变量优先级要高;如果存在与全局变量名称相同的局部变量(包括参数),那么该全局变量将不再起作用。

    看到这个的时候,我貌似有点点明白了。

    也就是说我在 标注3 处的定义,跟放在fun第一行定义没有区别的,因为只要函数内部定义了,它的作用范围就是从开始到结尾(定义时候没有赋值,所以Undefined

    顺便又看了一些深一点的知识。

    JavaScript语言块的范围跟其它(比如C)是不同的,它是用function来划分的,称为方法块(是根据后面的{}来划分)。

    也就是说for,while,等内部定义的变量,虽然有{},但出了{},还是有效的。

     例:q,x,y,z 分别在函数的不同位置定义,但他们的作用范围是相同的,都相当于在函数开始定义的,好神奇,也好TMD的难理解呀,有么有?

    function test(q) 
    {
           // 在整个函数中,x都有意义
           var x=0;                          
           if(typeof(q)=="object")
          {
               //y不仅在if块中有意义,在整个函数中都有意义
              var y=0;             
             for(var z=0;z<5;z++) 
            {        
                    //z不仅在for循环中有意义,在整个函数中都有意义
                     document.write(z);
             }
             document.write(z);             //z仍旧有意义,输出5
          }
          document.write(y);                //y仍旧有意义
    }        

    // 问题:如果在这里 alert(x) 会怎么样呢?

     根据上面的三点应该很容易看出来:如果在函数外面 alert(x) ,会出现致命错误,脚本停止!因为x在函数外面是没有定义的。

    那么,当局部变量与全局变量重名时候,怎么获取全局变量的值呢?

    哈哈,最简单的当然是避免全局变量与局部变量相遇咯!

    此外,用window.全局变量名

    例子:

    <script>  
        var a =0;         // 全局a定义
    function test(){     
            alert(window.a);  //a为1,这里的a就取的是全局变量  
            var a=2;     //局部变量a定义  
            alert(a);     //a为2,这里的a是局部变量!  
        }   
    test(); alert(a);
    //全局的a,当然也可以用window.a </script>

    至此,问题也算搞明白了!

  • 相关阅读:
    [JLOI2015] 管道连接
    【知识点】斯坦纳树
    [ZJOI2010] 网络扩容
    【知识点】网络流常见模型
    [NOI2009] 植物大战僵尸
    [NOI2007] 货币兑换
    【知识点】分治相关算法
    [NOI2005] 月下柠檬树
    [HNOI2012] 射箭
    [SDOI2014] 向量集
  • 原文地址:https://www.cnblogs.com/wsun/p/4032764.html
Copyright © 2011-2022 走看看