zoukankan      html  css  js  c++  java
  • javascript的作用域相关整理

    javascript作用域相关整理。

    在js中,var声明的变量,如果在方法中声明,那么就是局部变量,如果在全局声明则是全局变量。

    如果变量没有通过var声明,直接赋值,则自动默认为全局变量。

    ps:方法块中才是局部变量范围,具体指函数的{ }内,循环、判断并不是作用域的判断标准。

    在js执行之前,js会自动分析所有代码的声明部分,判断各个变量的声明。具体看例二和例三。

    一、全局作用域(全局作用域就是在整个代码中都能访问的对象)

    第一种全局作用域是最外面定义的变量

    var toDay = "Tuesday";
    function func() {
        var yesterday = "Monday";
        function func2() {
            console.log(yesterday);
        }
        func2()
    }
    alert(toDay);
    {#提示Tuesday#}
    alert(yesterday);
    {#报错#}
    func();
    {#打印Monday#}
    func2();
    {#报错#}

    1,最外面声明的变量,方法内都可以调用。

    2,外面函数声明的变量,里面的函数可以调用。

    3,外面不能调用函数里面声明的变量。

    4,外面不能调用函数里面的函数。

    第二种是不写var的变量

    function func() {
        toDay = "Tuesday";
        var yesterday = "Monday";
        alert(toDay)
    }
    func();
    {#执行函数,提示Tuesday#}
    alert(toDay);
    {#提示Tuesday#}
    alert(yesterday);
    {#报错#}

    没有定义,直接赋值,自动声明为全局变量。

    还有一种,所有window对象的属性拥有全局作用域。

    一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

     ps:什么是window对象

    window对象
    所有浏览器都支持 window 对象。
    概念上讲.一个html文档对应一个window对象.
    功能上讲: 控制浏览器窗口的.
    使用上讲: window对象不需要创建对象,直接使用即可
    
    
    alert() 显示带有一段消息和一个确认按钮的警告框。
    confirm() 显示带有一段消息以及确认按钮和取消按钮的对话框。
    prompt() 显示可提示用户输入的对话框。
    
    open() 打开一个新的浏览器窗口或查找一个已命名的窗口。
    close() 关闭浏览器窗口。
    
    setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。
    clearInterval() 取消由 setInterval() 设置的 timeout。
    setTimeout() 在指定的毫秒数后调用函数或计算表达式。
    clearTimeout() 取消由 setTimeout() 方法设置的 timeout。
    scrollTo() 把内容滚动到指定的坐标。

    二、局部变量(在函数内部,当局部变量与全局变量重名时,局部变量优先级高于全局变量,但不会在内存区域中覆盖全局变量:)

    简单说就是,局部变量在局部范围内会覆盖全局变量,但离开局部变量范围,会变回全局变量。

     例一

    1 <script type="text/javascript">  
    2  var a = "Hello";  
    3  function test(){  
    4       var a;  
    5       alert(a);  //未定义,因为方法内的声明没有赋值
    6       a = "World";  
    7       alert(a);  //World
    8  }  
    9 </script>

    执行结果是未定义和world

     例一中,由于在函数中声明了a,所以这个a是局部变量,然而没有赋值,直接alert,所以结果会报未定义。

    例二

     1 <script>
     2  var a = "Hello";
     3   function test(){
     4        alert(a); //Hello
     5        a = "World";
     6        alert(a); //World
     7                 }
     8      test();
     9      alert(a) //Hello
    10  </script>

    执行结果为Hello World

    在方法test中,首先alert(a); 由于a在方法块中也没有var声明,所以直接找外面的全局变量a="Hello".

    后面由于在次全局变量赋值为world,所以第二次alert就变成了world,需要注意的是,此时,外面的全局变量已经被覆盖为world了。

    所以即便在方法外面执行alert也是world。

    例三

     1 <script>
     2     var a =1;
     3     function test(){
     4         alert(a); //未定义
     5         a=4;
     6         alert(a); //4
     7         var a;   
     8         alert(a); //4,上面第五行已经赋值了
     9     }
    10     test();
    11     alert(a); //1
    12 </script>

    例三需要注意的是,js程序执行前会先找到所有声明的变量,test方法中,第一个alert(第四行),

    这里js程序执行前不会去找方法外面声明的a=1,而是先找方法块内{ } var声明的a,但是此时a还没有被赋值,所以结果是未定义,所以如果此时将函数内的var a删掉,

    第四行的代码就会去找方法外面声明的var a=1了。

    在最后,alert(a),这次还是找到的第二行的var a=1,因为test方法内的局部变量只能影响在test函数内,并不能影响全局范围。

    总结:

    JavaScript通过函数管理作用域。

    局部变量:在函数内部声明的变量是局部变量,只能在这个函数内部使用,函数外部不可用。

    全局变量:在任何函数外面声明的变量;或是未经声明在函数内部直接简单使用的变量。

    全局对象:每个JavaScript环境有一个全局对象,当你在适当的地方使用this的时候可以访问到。你创建的每一个全局变量都是这个全局对象的属性或数组元素。在浏览器中,为方便起见,该全局对象有个附加属性叫做window,此window(通常)指向该全局对象本身。

  • 相关阅读:
    PHP开发APP接口(九)
    C#深入理解类型
    C#从委托、lambda表达式到linq总结
    C# ==和Equals()
    C# 泛型
    C# Reflection
    原声JS网络请求
    JavaScript预编译
    泛型初探
    C#内存分配
  • 原文地址:https://www.cnblogs.com/ArmoredTitan/p/7724248.html
Copyright © 2011-2022 走看看