• 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>
  • 相关阅读:
    [经验] 如何在虚拟机上安装 CentOS
    [经验] Java 使用 netty 框架, 向 Unity 客户端的 C# 实现通信[2]
    [经验] Java 使用 netty 框架, 向 Unity 客户端的 C# 实现通信 [1]
    [经验] 关于 Java 中的非空判断
    [经验] Java Web 项目怎么部署到 Linux 系统上
    求和
    引用与指针
    C++学习前言
    大O
    ubuntu连接不上mysql问题
  • 原文地址:https://www.cnblogs.com/Zcyou/p/10892176.html
Copyright © 2020-2023  润新知