·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

FLASH变量和作用域的详细分析(2)

时间:2011-08-24 11:54CuPlayer.com
时间轴变量 时间轴变量可用于该特定时间轴上的任何脚本。要声明时间轴变量,请使用 var 语句并在该时间轴中的任一帧上初始化这些变量。该变量可以用于该帧和其后的所有帧,如下面的示例所示。 在文档中使用时间轴变

  时间轴变量
  时间轴变量可用于该特定时间轴上的任何脚本。要声明时间轴变量,请使用 var 语句并在该时间轴中的任一帧上初始化这些变量。该变量可以用于该帧和其后的所有帧,如下面的示例所示。

  在文档中使用时间轴变量:
  创建一个新的 Flash 文档并将它命名为 timelinevar.fla。
  将下面的 ActionScript 添加到时间轴中的第 1 帧: var myNum:Number = 15; /* 在第 1 帧中初始化,这样它可用于所有帧 */

  选择时间轴上的第 20 帧。
  选择"插入">"时间轴">"空白关键帧"。
  选择了新的关键帧之后,在"动作"面板中键入以下 ActionScript: trace(myNum);

  选择"控制">"测试影片"对该新文档进行测试。
  大约一秒钟之后,在"输出"面板中出现值 15。因为默认情况下 Flash 文档是循环播放的,所以每次播放头到达时间轴上的第 20 帧时,值 15 就会在"输出"面板中再次出现。要停止循环动作,请在 trace() 语句之后添加 stop();。
  必须首先声明时间轴变量,然后再尝试在脚本中访问它。例如,如果将代码 var myNum:Number = 15; 放置在第 20 帧中,则附加到第 20 帧之前的任何帧上的脚本都无法访问 myNum,它们都是未定义的,而不包含值 15。

  本地变量
  在函数体内使用 var 语句时,声明的是本地变量。在函数块(又称函数定义)内声明一个本地变量时,该变量是在该函数块的作用域内定义的,因而在该函数块结束时会过期。因此,本地变量仅存在于该函数中。

  例如,如果在名为 localScope 的函数中声明一个名为 myStr 的变量,该变量在该函数外部将不可用。
 

  1. function localScope():Void {   
  2. var myStr:String = "local";   
  3. }   
  4. localScope();   
  5. trace(myStr); // Undefined,因为 myStr 不是在全局作用域内定义的  

  如果用于本地变量的变量名已经被声明为时间轴变量,则当本地变量在作用域内时,本地定义优先于时间轴定义。时间轴变量在该函数外部仍然存在。例如,下面的代码创建了一个名为 str1 的时间轴字符串变量,然后在 scopeTest() 函数中创建一个具有相同名称的本地变量。该函数中的 trace 语句生成该变量的本地定义,而函数外部的 trace 语句生成变量的时间轴定义。

  1. var str1:String = "Timeline";   
  2. function scopeTest():Void {   
  3. var str1:String = "Local";   
  4. trace(str1); // 本地   
  5. }   
  6. scopeTest();   
  7. trace(str1); // 时间轴  


  在下一个示例中您可以看到,某些变量仅在特定函数的生命期内有效,如果尝试在该函数的作用域外引用该变量,就会生成错误。

  在应用程序中使用本地变量:
  创建一个新的 Flash 文档。
  打开"动作"面板("窗口">"动作"),在时间轴的第 1 帧上添加下面的 ActionScript:
 

  1. function sayHello(nameStr:String):Void {   
  2. var greetingStr:String = "Hello, " + nameStr;   
  3. trace(greetingStr);   
  4. }   
  5. sayHello("world"); // Hello, world   
  6. trace(nameStr); // undefined   
  7. trace(greetingStr); // undefined  


  选择"控制">"测试影片"来测试该文档。
  Flash 在"输出"面板中显示字符串"Hello, world",并显示 nameStr 和 greetingStr 的值为 undefined,因为这些变量在当前的作用域内不再可用。仅能在 sayHello 函数执行时引用 nameStr 和 greetingStr。函数退出后,这些变量将不再存在。

  变量 i 和 j 经常用作循环计数器。在下面的示例中,将 i 用作本地变量;它只存在于 initArray() 函数的内部:

  1. var myArr:Array = new Array();   
  2. function initArray(arrayLength:Number):Void {   
  3. var i:Number;   
  4. for(i = 0; i < arrayLength; i++) {   
  5. myArr = i + 1;   
  6. }   
  7. }   
  8. trace(myArr); // <blank>   
  9. initArray(3);   
  10. trace(myArr); // 1,2,3   
  11. trace(i); // undefined  

  注意 下面的 for 循环语法也很常见:for (var i:Number = 0; i < arrayLength; i++) {...}。
  因为变量 i 不是在主时间轴中定义的,所以此示例在 Flash 测试环境中显示 undefined。它仅存在于 initArray() 函数中。

  可以使用本地变量防止出现名称冲突,名称冲突可能会导致应用程序出现意外结果。例如,如果将 age 用作本地变量,可以用它在一个上下文中存储一个人的年龄,而在另一个上下文中存储此人的孩子的年龄。因为是在不同的作用域中使用这些变量的,因此在这种情况下不会有冲突。

  在函数体中使用本地变量是一个很好的习惯,这样该函数可以充当独立的代码。只能在本地变量的代码块中对它进行更改。如果函数中的表达式使用全局变量,则该函数外部的代码或事件也可以更改它的值,这样也更改了该函数。

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器