Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 允许事件侦听器访问其函数之外的变量_Actionscript 3_Flash_Flashdevelop - Fatal编程技术网

Actionscript 3 允许事件侦听器访问其函数之外的变量

Actionscript 3 允许事件侦听器访问其函数之外的变量,actionscript-3,flash,flashdevelop,Actionscript 3,Flash,Flashdevelop,现在。。。我知道如果我将varOne放在类中,它将被视为一种“全局变量”(如果我错了,请纠正我…)我想知道是否有其他方法让EventListener看到varOne的值?您可以将侦听器放在函数中,这样它将成为一个闭包,并且可以访问局部函数vars public class Main extends MovieClip { public function Main():void { getOne() } function getOne():void { va

现在。。。我知道如果我将varOne放在类中,它将被视为一种“全局变量”(如果我错了,请纠正我…)我想知道是否有其他方法让EventListener看到varOne的值?

您可以将侦听器放在函数中,这样它将成为一个闭包,并且可以访问局部函数vars

public class Main extends MovieClip {

  public function Main():void {
    getOne()
  }

    function getOne():void {
      var varOne:Boolean = false;

      stage.addEventListener(MouseEvent.CLICK, dunClicked);
    }

    function dunClicked(e:Event):void {
      if(!varOne) trace("Nope...");
    }
}

将“varOne”声明为主类的成员是最好的做法。创建闭包(内部函数)当然也可以,但这不是一个很好的实践,因为您无法删除使用这种匿名函数定义的事件侦听器

它不是“全局的”,而是这个类实例的一个属性,从技术上讲,您应该通过编写“this.varOne”(和“this.getOne()”、“this.dunClicked”…)来访问它,但在AS3/Java/等中,您可以只编写“varOne”

function getOne():void {
  var varOne:Boolean = false;

  stage.addEventListener(MouseEvent.CLICK, dunClicked);

  function dunClicked(e:Event):void {
     if(!varOne) trace("Nope...");
  }
}

我觉得自己超级笨。。。我不知道我可以嵌套这样的函数。。。我已经做了一个月了。谢谢Vita。实际上,我不建议使用这种方法,因为代码的可读性和可支持性会受到影响。只使用类变量和常规方法这是一个非常糟糕的实践。您限制了处理程序的作用域,还必须处理内存问题(每次运行getOne()时,都会创建dunClicked()并将其存储在内存中。因此,您对100个对象执行此操作,现在创建它100次,而不是一次)。基本编程标准实践:永远不要嵌套函数,永远不要内联定义函数。请不要这样做。函数闭包是贫民区。@Apocalyptic0n3我甚至没想到。。。我当然想把它做得“正确”,但这似乎不是正确的选择。宣布“varOne”为主类的成员是正确的选择。它不是全局的,而是这个类实例的一个属性。从技术上讲,您可以通过写“this.varOne”来访问它,也可以像您希望的那样写为“varOne”。@Philippe,如果这是正确的方法,请将其作为答案发布,我很乐意更改我选择的内容。
public class Main extends MovieClip {

   private var varOne:Boolean; // defaults to false;

   public function Main():void {
      getOne()
   }

   function getOne():void {
      stage.addEventListener(MouseEvent.CLICK, dunClicked);
   }

   function dunClicked(e:Event):void {
      if (!varOne) trace("Nope...");
      // if (!this.varOne) trace("Nope..."); // this is equivalent
   }
}