【问题标题】:What is the difference between scope and block?范围和块有什么区别?
【发布时间】:2014-03-22 08:50:10
【问题描述】:

在书上看到一段代码,如下:

x = 10;
if(x ==10) { // start new scope
int y = 20; // known only to this block
x = y * 2;
}

作用域和块都一样吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    作用域是您可以引用变量的地方。 一个块定义了一个block scope一个块内定义的变量将只定义在该块内,你不能在块结束后引用它。

    如果您尝试以下代码,则在此代码中:

    x = 10;
    if(x ==10) { // start new scope
    int y = 20; // known only to this block
    x = y * 2;
    }
    
    y = 5; // error y is out of scope, not it is not defined
    

    因为您在这里拥有的是本地范围
    Java 中的其他类型的范围是 class scope(例如),类的成员具有类范围,因此它可以在类中的任何位置访问。

    范围的基本规则是:

    1. 参数声明的范围是方法的主体 声明出现的位置。
    2. 局部变量声明的范围是从 声明出现在该块的末尾。
    3. 出现在 for 语句头的初始化部分是 标题中的 for 语句和其他表达式。
    4. 方法或字段的范围是类的整个主体。这 允许类的非静态方法使用字段和其他 类的方法。

    【讨论】:

      【解决方案2】:

      来自Java language specification

      14.2. Blocks:

      块是一系列语句、局部类声明和 大括号内的局部变量声明语句。

      6.3. Scope of a Declaration

      声明的范围是程序所在的区域 声明所声明的实体可以使用 简单的名称,只要它是可见的(§6.4.1)。

      在一个块中,你可以声明变量。作用域定义了区域,您可以在其中访问通过其简单名称声明的变量。

      【讨论】:

        【解决方案3】:

        当涉及到条件和循环时,如果您不指定 {},那么紧随其后的语句是唯一属于特定条件或循环的语句

        例如

        x = 10;
        if(x ==10) 
        { 
        int y = 20; 
        x = y * 2;
        }
        both lines get executes only if condition returns TRUE
        
        x = 10;
        if(x ==10) 
        int y = 20;
        x = y * 2; // this is not belong to if condition. therefore it will execute anyway
        

        【讨论】:

          【解决方案4】:

          它们大多相同。

          块是一些被 { 和 } 包围的代码。范围是程序中某个事物可见的部分。据我所知,所有块都创建范围 - 块中定义的任何内容在块外都不可见。反之则不成立。

          以下是一些没有块的作用域:

          for(int k = 0; k < 10; k++) { // k<10 and k++ are in a scope that includes k, but not in a block.
              System.out.println(k); // this is in a block (the {})
          }
          
          for(int k = 0; k < 10; k++) // k<10 and k++ are in a scope that includes k, as above
              System.out.println(k); // but there's no block!
          
          class Test {
              // this is a scope but not a block. Not entirely sure about this one.
              int x = 2;
              int y = x + 1; // I can access x here, but not outside the class, so the class must be a scope.
          }
          

          【讨论】:

            【解决方案5】:

            根据Block的定义

            块是一组在平衡大括号之间的零个或多个语句,可以在任何允许使用单个语句的地方使用。

            所以

            {   //block started
            
            }    //block ended
            

            无论在块内声明的变量是什么,范围都限制在该块内。

            这有意义吗??

            【讨论】:

              【解决方案6】:

              oracle 文档将块定义为

              块是一组零个或多个平衡括号之间的语句 并且可以在任何允许使用单个语句的地方使用

              @Mhd.Tahawi 已经告诉过作用域是什么。

              我要指出一点,

              switch(something){
                  case somethin1:
                      line1
                      line2
                      break;
                  case someting2:
                      line3
                      line4
                      break;
              }
              

              line{1,2,3,4} 在同一范围内因此阻塞,因为我没有用大括号开始和结束每个案例。与python不同,缩进并不意味着块

              【讨论】:

                【解决方案7】:

                Scope 指的是visibility of variables。换句话说,程序的哪些部分可以看到或使用它。通常,每个变量都有一个全局范围。定义后,程序的每个部分都可以访问变量。

                能够将变量的范围限制为单个function/block 非常有用。该变量将具有有限的范围。这样,function/block 内部的更改就不会以意想不到的方式影响主程序。

                【讨论】:

                  【解决方案8】:

                  来自Mozilla's A re-introduction to JavaScript (JS Tutorial)

                  JavaScript 与其他语言(如 Java)之间的一个重要区别在于,在 JavaScript 中,块没有作用域。只有函数有范围。因此,如果在复合语句中使用 var 定义变量(例如在 if 控制结构中),它将对整个函数可见。但是,从 ECMAScript 2015 开始,let 和 const 声明允许您创建块范围的变量。

                  鉴于 var 的示例以及它们与 int 和 const 的不同之处,我们可以得出结论,在 JavaScript 中,使用 var 声明的变量在其直接“范围”之外是可见的,如我们通常会在其他语言中使用这个词。

                  在给出的示例中,在 for 循环中使用 var 声明的内容可从 函数中的任何位置获得,无论是在声明它的 for 循环之前还是之后。

                      // myVarVariable *is* visible out here
                  
                      for (var myVarVariable = 0; myVarVariable < 5; myVarVariable++) { 
                        // myVarVariable is visible to the whole function 
                      } 
                  
                      // myVarVariable *is* visible out here 
                  

                  这与使用 let 和 const 声明的任何内容形成对比,后者仅限于声明它们的 ,在很大程度上,变量仅限于单个集合的直接范围花括号 { } 在其他语言中。

                  故事的寓意:如果您习惯于其他语言,请小心使用 var。它比您想象的更强大和更明显。

                  【讨论】:

                    【解决方案9】:

                    对于一般的编程语言来说,块的作用域(也称为块作用域)只是作用域的一种;见https://en.wikipedia.org/wiki/Scope_(computer_science)#Levels_of_scope

                    某些语言,如 Python,既没有块也没有块作用域(而是有函数作用域、全局作用域等)。

                    【讨论】:

                      猜你喜欢
                      • 2014-12-22
                      • 2013-08-19
                      • 2012-12-11
                      • 2015-09-22
                      • 2013-12-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-06-22
                      • 1970-01-01
                      相关资源
                      最近更新 更多