繁体   English   中英

AVM /编译器/范围处理AS3变量

[英]AS3 variables handling by AVM/compiler/scope

我对AVM /编译器/范围处理AS3变量有几个问题

.1。 Flash中的以下代码将引发错误:

function myFunction() {
    var mc:MovieClip=new MovieClip();
    var mc:MovieClip=new MovieClip();
}

但不会在Flex中引发错误(仅在编辑器中警告)。 为什么?


.2。 Flash如何在循环中看到变量? 显然这:

for (var i:int=0; i<2; i++) {
    var mc:MovieClip=new MovieClip();
}
不等于:
 var mc:MovieClip=new MovieClip(); var mc:MovieClip=new MovieClip(); 
因为它将在Flash中再次引发错误,但在Flex中却不会? Flash在编译前是否以某种方式更改了我的循环?


.3。 在类中与Flash中的时间轴等效的位置-在类中,我会将通常放置在时间轴上的代码放在其中(由于我之前编写的内容,我认为它不是构造函数,或者可能是Flash / Flex编译器的问题)?


@ fenomas感谢您的解释,但我检查了1.答案,这并不是很真实:)这段代码:

 function myFunction() { var mc:MovieClip=new MovieClip(); mc.graphics.beginFill(0x0000FF); mc.graphics.drawRect(0,0,100,100); mc.graphics.endFill(); addChild(mc); var mc:MovieClip=new MovieClip(); mc.graphics.beginFill(0x000000); mc.graphics.drawRect(0,0,30,30); mc.graphics.endFill(); addChild(mc); } myFunction(); 
将以严格模式在Flash中进行编译,但会关闭警告模式,并且在编译或运行时不会引发错误。

而且,它还将在Flex中进行编译并很好地执行(带有-strict -warnings编译器命令的事件)(已通过Flash CS3和FlashBuilder 4进行了检查)。

相同的代码但未包装在函数中,无论在Flash中打开任何错误模式(严格/警告)时,都会生成编译时错误。

那是@ back2dos关于行为异常的Flash Compiler所说的吗?

这两个编译器Flash / Flex之间有什么区别(为什么我必须在Flash中更改错误模式,而Flex却不关心任何东西:))?

好吧,我将向您解释程序包级ActionScript(类和全局函数)的作用域。

var语句在其所在的函数体的范围内声明一个变量。它的可见性在整个体内。 因此以下内容完全有效。

a = 3;
if (Math.random()>0.5) {
    var a:int = 0;
}
else {
    a = 6;
}

这太可怕了,但是它是基于废弃的ECMA-Script草稿AS3所基于的。。。 :(

为了简单起见,假设所有变量声明实际上都在包含函数体的开头(而它们的初始化实际上是在放置它的位置执行的)

从而

for (var i:int=0; i<2; i++) {
    var mc:MovieClip=new MovieClip();
}

等于

var i:int, mc:MovieClip;
for (i=0; i<2; i++) {
    mc=new MovieClip();
}

从第一个问题到重复变量定义的第一段代码,这会引起编译器警告,但其工作方式就像您只进行了一个声明一样。

至于第三个问题:根本没有对等的东西。

Flash IDE中的AS3和许多设计人员友好的概念(例如框架)都非常含糊。 从开发人员的角度来看,Flash IDE大约是您可以花钱买到的最差的cr * p(这使其无法成为设计,绘制和动画的出色工具)。 如果您想要清晰一致的行为,我建议您不要使用Flash IDE编译ActionScript或浪费时间尝试找出其行为如此怪异的原因。 除了它的怪癖之外,它还需要花费很长时间进行编译,并且会对ActionScript产生奇怪的影响(例如将局部变量声明转换为实例字段声明(这可能是问题的根源))。

这些是很好的问题。 为了:

  1. 默认情况下,Flash Authoring FLA以严格模式启动。 您可以在“文件”>“发布设置”>“ AS3设置”中进行更改。 但是,重复的变量定义不是运行时错误,而是创作环境可能会或可能不会发出警告或错误的错误,具体取决于配置以及它是类脚本还是框架脚本。

    顺便说一句,在比较Flash和Flex时,请确保Flash脚本在类内,因为框架脚本是一个细微的不同动物(如下所述)。

  2. AS3没有块级作用域,因此它实现了一种称为“提升”的实践,在该实践中,编译器将所有声明(而不是赋值)都移到发生它们的函数的开头。 因此,即使您的var语句在循环内,函数开始执行时,声明仅发生一次。 有关更多详细信息,请参见此处

  3. 框架脚本有点异常。 它们有点像匿名函数,只是给定时间轴上的所有脚本都被认为在相同的词法范围内。 因此,如果使用var语句在一个框架脚本中创建局部变量,则当您对同一对象执行不同的框架脚本时,该变量仍然存在。

    这基本上是出于历史原因,但是结果实质上与将所有框架脚本都集成到一个大函数中并与GOTO一起跳转是相同的。 因此,您应始终将所有真实代码保留在类中,并仅使用框架脚本来调用需要与时间轴动画同步的类方法。 这不仅使您避免需要精确了解框架脚本与类代码的区别,而且由于与我们在此谈论的内容无关的几个原因,它是一种很好的编码实践。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM