Actionscript 3 允许事件侦听器访问其函数之外的变量
现在。。。我知道如果我将varOne放在类中,它将被视为一种“全局变量”(如果我错了,请纠正我…)我想知道是否有其他方法让EventListener看到varOne的值?您可以将侦听器放在函数中,这样它将成为一个闭包,并且可以访问局部函数varsActionscript 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
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
}
}