【问题标题】:EventListeners in nested Functions嵌套函数中的事件监听器
【发布时间】:2012-03-12 17:40:18
【问题描述】:

我在包含嵌套函数的函数之外有几个 MouseEvent 侦听器,这些嵌套函数需要使用附加到侦听器的函数。

button1.addEventListener(MouseEvent.ROLL_OVER, buttonOver); 

function navigation (): void {

    if statements;

    function buttonOver(event:MouseEvent):void {
        movieclip.play();
    }
}

我不断收到“1120:未定义属性 buttonOver 的访问”错误。我知道这是因为 EventListener 在函数“导航”之外,但我需要稍后其他函数访问它。我是不是搞错了?

【问题讨论】:

    标签: actionscript-3 function addeventlistener nested-function


    【解决方案1】:

    那是行不通的。我不认为你应该嵌套函数。为什么不使用可以从其他类/实例访问的类?

    罗伯

    【讨论】:

    • 你可以在一个类中执行多个公共函数吗?
    • 我开始发现我在这方面远远落后,这太荒谬了。我怀念 C++ 和 HTML 的美好时光。
    • 别担心。您可以使用 ActionScript 中的类做一些非常酷的事情,并且不难理解它。看看这个教程,它应该会给你一个想法:adobe.com/devnet/actionscript/articles/oop_as3.html
    • 我一直在回去重写我的 as 而没有嵌入函数。这变得多么容易太疯狂了。感谢您的帮助
    【解决方案2】:

    忘记嵌套和匿名函数。并且忘记在框架中编写代码。您可以在不使用它们的情况下做任何您想做的事情。

    【讨论】:

    • 这是一个单独的 .as 文件; .fla 中实际上没有代码。这是我自 AS 1.0 以来第一次回到 AS,所以我的进度很慢。
    【解决方案3】:

    我不确定你为什么首先需要嵌套函数。没有嵌套,一切都会容易得多。

    button1.addEventListener(MouseEvent.ROLL_OVER, buttonOver); 
    
    function navigation (): void {
    
        if statements;
    }
    function buttonOver(event:MouseEvent):void {
        movieclip.play();
    }
    

    【讨论】:

      【解决方案4】:

      我不确定,但也许您希望根据某些条件添加然后删除事件侦听器?

      当我看到初学者尝试嵌套事件处理程序时,这似乎是最常见的错误。

      function navigation (): void {
          if (somethingTrue){
              button1.addEventListener(MouseEvent.ROLL_OVER, buttonOver); 
          else if(somethingElseTrue){
              button1.removeEventListener(MouseEvent.ROLL_OVER, buttonOver);
          }  
      }
      
      function buttonOver(event:MouseEvent):void {
          movieclip.play();
      }
      

      【讨论】:

        【解决方案5】:

        正如其他答案所提到的,您的嵌套函数仅限于定义它的函数的范围。您尝试在该函数之外访问它会引发错误。以下相关 Adob​​e 文档:

        http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f54.html

        将嵌套函数移到嵌套函数之外,或将侦听器更改为调用navigation 并要求navigation 调用buttonOver

        【讨论】: