• JavaScript局部变量和全局变量的理解


    原文链接:http://www.cnblogs.com/eric-qin/p/4166552.html

    JavaScript局部变量和全局变量的理解

     
    1
    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>

      window.alert(this.a)在这里等同于alert(window.a)

  • 相关阅读:
    office 2007
    关于网站爬虫的爬取
    华为交换机默认密码大合集
    一些不错的网站工具箱
    HDU 2023 求平均成绩
    HDU 2056 Rectangles
    HDU 2022 海选女主角
    HDU 2045 不容易系列之(3)—— LELE的RPG难题
    HDU 2042 不容易系列之二
    HDU 2044 一只小蜜蜂...
  • 原文地址:https://www.cnblogs.com/gavinyyb/p/6251188.html
Copyright © 2020-2023  润新知