BeanShell变量的基本范围

注意:自 BeanShell 的 1.3 版本以后“松散”类型变量的默认范围发生了变化,与 Java 的更加一致。BeanShell 仍然支持兼容以前版本的类型范围。通过设置系统属性“本地化范围”为“true”,这种模式可以启用旧版本中的代码。可参见之后会讲到的“本地化范围”。

BeanShell 中的变量范围尽可能会像 Java 表现的那样。然而,普通的 Java 并不支持“松散”类型的变量(即变量可以不用先声明就能使用)。所以我们就必须在 BeanShell 中定义这样的行为。我们会在下一部分关于未指定类型的变量中看到——变量没有声明并且也没有在其他地方为变量指定一个值——默认为“本地化”范围。这意味 着在一般情况下,如果你没有先声明变量就为变量指定一个值,你在当前的范围中就创建了一个本地变量。

代码块

代码块就是代码包含在“{}”大括号中间的代码。在 BeanShell 中,和 Java 一样,代码块为指定类型的变量定义了范围的级别:在一个块中声明的类型变量就属于当前这块范围内。按惯例,在这块范围中哪里出现其他变量的分配,哪里就定义了变量。
然 而,在 BeanShell 中没有指定类型的变量就不受代码块的约束。反而他们会在该范围级别的外面(也是封闭的范围)进行声明。这一点,BeanShell 代码看起来正好类似 Java 代码。在 BeanShell 中如果你在代码块中声明了一个带类型的变量,那么它就在本块中起作用。但是如果你使用了一个不带类型的变量(看起来正好像在 Java 中一个普通的变量分配),那么它就表现为在一个封闭范围中的变量分配。

下面举几个有意义的例子:

  
  
  
  
  1. // 任意的代码块 
  2. y = 2; // 不带类型的变量的赋值 
  3. int x = 1; // 带类型的变量的赋值 
  4. print( y ); // 2 
  5. print( x ); // 错误! x 未定义。 

  
  
  
  
  1. // 同样出现在声明的代码块中: if, while, try/catch, 等 
  2. if ( true ) { 
  3. y = 2; // Untyped variable assigned 
  4. int x = 1; // Typed variable assigned 
  5. print( y ); // 2 
  6. print( x ); // Error! x 未定义 



在 for 循环的初始化区域声明的变量沿用了代码块同样规则:

  
  
  
  
  1. forint i=0; i<10; i++ ) { // 带类型的 for 初始化变量 
  2. j=42; 
  3. print( i ); // 错误! 'i' 未定义 
  4. print( j ); // 42 

  
  
  
  
  1. for( z=0; z<10; z++ ) { } // 不带类型的 for 初始化变量 
  2. print( z ); // 10 

你可能感兴趣的:(BeanShell松散类型,不带类型变量,变量作用域范围,BeanShell与Java,BeanShell变量范围)