事件处理函数的范围

在事件处理函数内声明和执行的变量和命令的范围(即上下文)取决于所使用的事件处理函数的类型:事件处理函数或事件侦听器,或者 on()onClipEvent() 处理函数。

分配给事件处理函数方法和事件侦听器的函数(类似您编写的所有动作脚本函数)定义本地变量范围,但 on()onClipEvent() 处理函数却不是这样。

例如,以下面两个事件处理函数为例。第一个处理函数是与名为 clip_mc 的影片剪辑关联的 onPress 事件处理函数。第二个处理函数是附加到同一影片剪辑实例的 on() 处理函数。

// 附加到 clip_mc 的父级剪辑时间轴:
clip_mc.onPress = function () {
  var color; // 局部函数变量
  color = "blue";
}
// 附加到 clip_mc 的 on() 处理函数:
on (press) {
  var color; // 无局部变量范围
  color = "blue";
}  

尽管这两个事件处理函数包含相同的代码,但它们具有不同的结果。在第一个例子中,color 变量对于为 onPress 定义的函数而言是本地的。在第二个例子中,因为 on() 处理函数没有定义本地变量范围,所以变量的范围为影片剪辑 clip_mc 的时间轴。

对于附加到按钮(而不是影片剪辑)的 on() 事件处理函数,变量(以及函数和方法调用)的范围是包含该按钮实例的时间轴。

例如,以下 on() 事件处理函数将产生不同的结果,这取决于它附加到影片剪辑,还是附加到按钮对象。在第一个示例中,play() 函数调用启动包含该按钮的时间轴的播放头;而在第二个示例中,play() 函数调用启动该处理函数所附加到的那个影片剪辑的时间轴。

// 附加到按钮
on (press) {
  play(); // 播放父时间轴
}
// 附加到影片剪辑
on (press) {
  play(); // 播放影片剪辑的时间轴
}

也就是说,如果附加到按钮对象,play() 方法调用将应用于包含该按钮的时间轴,即该按钮的父时间轴。但如果将同一处理函数附加到影片剪辑对象,play() 将应用于包含该处理函数的影片剪辑。

在事件处理函数或事件侦听器函数定义内,相同的 play() 函数将应用于包含该函数定义的时间轴。例如,假定以下 MovieClip.onPress 事件处理函数是在包含影片剪辑实例 myMovieClip 的时间轴上定义的。

// 影片剪辑时间轴上定义的函数:
myMovieClip.onPress = function () {
  play(); // 播放包含该函数定义的时间轴
}

如果要播放定义 onPress 事件处理函数的影片剪辑,则必须使用 this 关键字显式引用该剪辑,如下所示:

myMovieClip.onPress = function () {
  this,play(); // 播放定义 onPress 处理函数的剪辑的时间轴
}

有关 this 关键字在事件处理函数中的范围的更多信息,请参见“this”关键字的范围