【发布时间】: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
在书上看到一段代码,如下:
x = 10;
if(x ==10) { // start new scope
int y = 20; // known only to this block
x = y * 2;
}
作用域和块都一样吗?
【问题讨论】:
标签: java
作用域是您可以引用变量的地方。
一个块定义了一个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(例如),类的成员具有类范围,因此它可以在类中的任何位置访问。
范围的基本规则是:
【讨论】:
来自Java language specification:
块是一系列语句、局部类声明和 大括号内的局部变量声明语句。
声明的范围是程序所在的区域 声明所声明的实体可以使用 简单的名称,只要它是可见的(§6.4.1)。
在一个块中,你可以声明变量。作用域定义了区域,您可以在其中访问通过其简单名称声明的变量。
【讨论】:
当涉及到条件和循环时,如果您不指定 {},那么紧随其后的语句是唯一属于特定条件或循环的语句
例如
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
【讨论】:
它们大多相同。
块是一些被 { 和 } 包围的代码。范围是程序中某个事物可见的部分。据我所知,所有块都创建范围 - 块中定义的任何内容在块外都不可见。反之则不成立。
以下是一些没有块的作用域:
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.
}
【讨论】:
根据Block的定义
块是一组在平衡大括号之间的零个或多个语句,可以在任何允许使用单个语句的地方使用。
所以
{ //block started
} //block ended
无论在块内声明的变量是什么,范围都限制在该块内。
这有意义吗??
【讨论】:
oracle 文档将块定义为
块是一组零个或多个平衡括号之间的语句 并且可以在任何允许使用单个语句的地方使用
@Mhd.Tahawi 已经告诉过作用域是什么。
我要指出一点,
switch(something){
case somethin1:
line1
line2
break;
case someting2:
line3
line4
break;
}
line{1,2,3,4} 在同一范围内因此阻塞,因为我没有用大括号开始和结束每个案例。与python不同,缩进并不意味着块
【讨论】:
Scope 指的是visibility of variables。换句话说,程序的哪些部分可以看到或使用它。通常,每个变量都有一个全局范围。定义后,程序的每个部分都可以访问变量。
能够将变量的范围限制为单个function/block 非常有用。该变量将具有有限的范围。这样,function/block 内部的更改就不会以意想不到的方式影响主程序。
【讨论】:
来自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。它比您想象的更强大和更明显。
【讨论】:
对于一般的编程语言来说,块的作用域(也称为块作用域)只是作用域的一种;见https://en.wikipedia.org/wiki/Scope_(computer_science)#Levels_of_scope。
某些语言,如 Python,既没有块也没有块作用域(而是有函数作用域、全局作用域等)。
【讨论】: