zoukankan      html  css  js  c++  java
  • Javascript的块级作用域

     

    一、块级作用域的说明

    在学习JavaScript的变量作用域之前,我们应当明确几点: 

    a、JavaScript的变量作用域是基于其特有的作用域链的。 
    b、JavaScript没有块级作用域。 
    c、函数中声明的变量在整个函数中都有定义。

      javascript的变量作用域,与平时使用的类C语言不同,例如C#中的代码:

    static void Main(string[] args)
    {
         if(true)
         {
            int number=10;
          }
        Console.WriteLine(number);
    }

      这段代码进行编译,是无法通过的,因为"当前上下文不存在number".

      因为这里变量的作用域是由花括号限定的,称为块级作用域

           在块级作用域下,所有的变量都在定义的花括号内,从定义开始到花括号结束这个范围内可以使用,出了这个范围就是无法访问,也就是说

    iftrue)
    {
        int number=10;
        Console.WriteLine(number);
    }

    这样可以访问,因为变量的定义与使用在同一个花括号内。

    但是在javascript中没有块级作用域的概念

    二、javascript中的作用域

     1、函数限定变量作用域

           在javascript中,函数里面定义的变量,,可以在函数里面被访问,但在函数外无法访问,代码:

    <script type="text/javascript">
       var  num=function()
       {
          var number=10;
       };
       try{
            alert(number);
       }catch(e)
       {
            alert(e);
       } 
    </script>

        代码运行时,会抛出一个异常,变量number没有定义,是因为定义在函数中的变量无法再函数外使用,在函数内可以任意使用,即使在赋值之前:

    <script type="text/javascript">
     var num=function(){
            alert(number);
            var number=10;
            alert(number);
      };
      try{
         num();
      }catch(e){
        alert(e);
      }
    </script>

        这段代码运行后,不会抛出错误,弹出两次,分别是undefined和10

     2.子域访问父域

         函数可以限定变量的作用域,那么在函数中的函数就为该作用域的子域,在子域中的代码可以访问到父域中的变量,代码如下:

    <script type="text/javascript">
     var func=function(){
           var number=10;
           var sub_func=function(){
                alert(num);
            };
          sub_func();
    };
    func();
    </script>

     这段代码执行得到的结果是10,但是在子域中访问父域的代码也是有条件的

    <script type="text/javascript">
     var func=function(){
           var number=10;
           var sub_func=function(){
                var num=20;
                alert(num);
            };
          sub_func();
    };
    func();
    </script>

    这段代码比前面多了一个"var num=20;",这句代码在子域中,那么子域访问父域的情况就发生了变化,这段代码打印的结果是20,此时子域访问的num是子域中的变量,而不是父域中的。由此可见访问有一定规则可言,在javascript中使用变量,javascript解释器首先在当前作用域中搜索是否有该变量的定义,如果有,就是用这个变量,如果没有就到父域中寻找变量,依次类推,直到最顶级作用域,仍然没有找到就抛出异常"变量未定义",代码如下:

    <script type="text/javascript">
      (function (){
         var num=10;
         (function (){
             var num=20;
              (function(){
              alert(num);
               })();
          })();
       })();
    </script>

    这段代码执行后打印出20,如果将"var num=20"取掉,那么打印的就是10.同样去掉"var num=10",那么就会出现未定义的错误。

  • 相关阅读:
    学生管理系统(3:添加查询界面)
    Django模块笔记【六】
    Django模块笔记【五】
    Django模块笔记【四】
    Django模块笔记【三】
    Django模块笔记【二】
    Django模块笔记【一】
    网络编程基础【CSS编程】
    Django入门笔记【六】
    Django入门笔记【五】
  • 原文地址:https://www.cnblogs.com/1312mn/p/3559942.html
Copyright © 2011-2022 走看看