我在一本书中看到了一段代码,如下所示:
x = 10;
if(x ==10) { // start new scope
int y = 20; // known only to this block
x = y * 2;
}
两者,代码和块一样吗?
答案 0 :(得分:13)
范围是您可以引用变量的地方。
块定义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 :(得分:7)
来自Java language specification:
块是一系列语句,本地类声明和 大括号内的局部变量声明语句。
声明的范围是程序的范围 声明声明的实体可以使用a来引用 简单名称,只要它是可见的(§6.4.1)。
在一个区块中,您可以声明变量。范围定义了区域,您可以通过其简单名称访问声明的变量。
答案 2 :(得分:3)
当谈到条件和循环时,如果你没有指定{}那么立即跟随语句是唯一属于特定条件或循环的语句
e.g。
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
答案 3 :(得分:3)
它们大致相同。
块是由{和}包围的一些代码。范围是程序的一部分,其中某些东西是可见的。据我所知,所有块都创建了范围 - 块中定义的任何块在块外都不可见。相反的情况并非如此。
以下是一些没有块的范围:
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.
}
答案 4 :(得分:3)
根据Block
的定义块是平衡大括号之间的一组零个或多个语句,可以在允许单个语句的任何位置使用。
所以
{ //block started
} //block ended
块中声明的变量是什么,范围仅限于该块。
这有意义吗?
答案 5 :(得分:3)
oracle docs将block定义为
块是平衡括号之间的一组零个或多个语句 并且可以在允许单个语句的任何地方使用
@ Mhd.Tahawi已经告诉了范围是什么。
我应该指出一件事,
switch(something){
case somethin1:
line1
line2
break;
case someting2:
line3
line4
break;
}
行{1,2,3,4}在同一范围内因此阻止,因为我没有用大括号开始和结束每个案例。与python不同,缩进并不意味着一个块
答案 6 :(得分:3)
Scope
指的是visibility of variables
。换句话说,程序的哪些部分可以查看或使用它。通常,每个变量都具有全局范围。一旦定义,程序的每个部分都可以访问变量。
能够将变量的范围限制为单个function/block
非常有用。该变量的范围有限。这样,function/block
内的更改就会以意想不到的方式影响主程序。
答案 7 :(得分:1)
来自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声明的任何内容形成对比,后者被限制在声明它们的 block 中,在很大程度上,变量被限制在单个set的立即范围内大括号{}用其他语言。
故事的寓意:如果您习惯使用其他语言,请注意var。它比您预期的要强大得多且可见。
答案 8 :(得分:0)
对于一般的编程语言,块的作用域(也称为块作用域)只是一种作用域。参见https://en.wikipedia.org/wiki/Scope_(computer_science)#Levels_of_scope。
某些语言(例如Python)既没有块也没有块范围(而是具有函数范围,全局范围等)。