zoukankan      html  css  js  c++  java
  • js中全局和局部变量的区别

    2
    3
    4
    5
    6
    7
    8
    9
    10
    <script type="text/javascript">
    var a = 1;
    function hehe()
    {
             window.alert(a);
             var a = 2;
             window.alert(a);
    }
    hehe();
    </script>

      

    执行结果如下所示:

    第一个alert:

    第二个alert:

    这是一个令人诧异的结果,为什么第一个弹出框显示的是undefined,而不是1呢?

    一个页面里直接定义在script标签下的变量是全局变量即属于window对象的变量,按照javascript作用域链的原理,当一个变量在当前作用域下找不到该变量的定义,那么javascript引擎就会沿着作用域链往上找直到在全局作用域里查找。

    首先这段程序涉及到了以下三个概念 执行环境、变量对象、 作用域链、 js的执行环境分全局的(浏览器的话就是window执行环境)和function执行环境,变量对象是用来保存执行环境下的变量和方法的,而作用域链上放着一个一个的变量对象形成一个链条。 这段代码的执行过程应该是这样的 首先进入全局执行环境 建立该执行环境下的变量对象A(保存有该执行环境下的x和一个匿名方法),再往下执行到匿名方法的执行环境 建立变量对象B(保存有该执行环境下的x),而js的当前执行环境的变量对象永远放在作用域链的最前端,所在执行第一个alert(x), 就会找当前执行环境的变量对象B是否保存有x, 而事实上是有的,但alert(x)之前没有给x赋值,所出得到的结果就是undefined, 如果变量对象B中不存在x,那么程序就会顺着作用域链找上一个变量对象A里是否有x. 

    js的变量有两种作用域:全局变量和局部变量。没有使用 var 声明的变量和在function之外声明的变量都是全局变量,是window属性之一;使用 var 声明的变量属于所在函数,不管在函数的哪个位置出现,等价于在函数一开始声明。局部变量比同名全局变量的优先级高,所以局部变量会隐藏同名的全局变量。要想访问被隐藏的全局变量就加上 window. 前缀。
    js没有块作用域,在语句块之后,在函数结束之前,语句块定义的变量都是可以访问的。比如:for(var idx =0; idx<2;idx++){} alert(idx); 结果显示为2。

     

    上段代码相当于

    1
    2
    3
    4
    5
    6
    7
    var x=1;
    function (){
    var x;
    alert(x);
     x=1212;
    alert(x);
    }

    正确代码:第一次要this.x 

    1
    2
    3
     
     
     
     
     
     
     
    4
    5
    6
    7
    8
    9
    10
    <script type="text/javascript">
    var a = 1;
    function hehe()
    {
             window.alert(this.a);
             var a = 2;
             window.alert(a);
    }
    hehe();
    </script>
  • 相关阅读:
    最近比较忙
    堆栈的实现
    推荐一款开源优秀Javascript编辑器Aptana Studio
    OOJ面向对象编程的三大特点封装,继承,多态分析与实例
    ASP.NET设计模式之单体模式Singleton
    OOJ面向对象的JAVASCRIPT(一)
    【转】性能优化关于Asp.net性能的技巧
    性能优化关于JQuery的性能优化
    学习javascript的动态this指针与动态绑定 call与apply函数的应用
    OOJ面向对象的JAVASCRIPT(二)
  • 原文地址:https://www.cnblogs.com/zhongxia-zx/p/12018941.html
Copyright © 2011-2022 走看看