动作脚本 2 函数

Posted

技术标签:

【中文标题】动作脚本 2 函数【英文标题】:Actionscript 2 functions 【发布时间】:2010-09-13 14:49:18 【问题描述】:

我是一位经验丰富的程序员,但刚开始使用 Flash/Actionscript。我正在做一个项目,由于某些原因需要我使用 Actionscript 2 而不是 3。

当我运行以下命令时(我只是将它放在新 Flash 项目的第一帧中),输出是 3 而不是 1 ?我需要它是 1。

为什么 'ii' 变量的范围在循环之间继续?

var fs:Array = new Array();

for (var i = 0; i < 3; i++)

    var ii = i + 1; 
    fs[i] = function()
        trace(ii);
    


fs[0]();

【问题讨论】:

【参考方案1】:

不幸的是,AS2 不是那种语言。它没有那种封闭。函数在 AS2 中并不完全是一等公民,其结果之一是函数不保留自己的作用域,它必须在调用时与某个作用域相关联(通常与函数所在的作用域相同)本身已定义,除非您使用函数的 callapply 方法)。

然后当函数被执行时,它内部的变量范围就是它碰巧被调用的范围——在你的例子中,你的循环之外的范围。这也是您可以这样做的原因:

function foo() 
    trace( this.value );


objA =  value:"A" ;
objB =  value:"B" ;

foo.apply( objA ); // A
foo.apply( objB ); // B

objA.foo = foo;
objB.foo = foo;

objA.foo(); // A
objB.foo(); // B

如果你习惯了真正的OO语言那看起来很奇怪,原因是AS2最终是一个prototyped language。一切看起来面向对象的东西都只是巧合。 ;D

【讨论】:

【参考方案2】:

不幸的是,Actionscript 2.0 没有强大的范围......尤其是在时间线上。

var fs:Array = new Array();

for (var i = 0; i < 3; i++)

    var ii = i + 1;     
    fs[i] = function()
        trace(ii);
    


fs[0]();
trace("out of scope: " + ii + "... but still works");

【讨论】:

【参考方案3】:

我想出了一种解决我自己问题的策略:

var fs:Array = new Array();

for (var i = 0; i < 3; i++)    
    var ii = i + 1;   

    f = function(j)
        return function()
            trace(j);
        ;
    ;
    fs[i] = f(ii);


fs[0](); //1
fs[1](); //2
fs[2](); //3

【讨论】:

这也是我在回复中试图说的,但由于某种原因,代码已损坏且无法正确显示

以上是关于动作脚本 2 函数的主要内容,如果未能解决你的问题,请参考以下文章

动作脚本函数可以找出自己的名称吗?

1021:我的动作脚本中的重复函数定义

传奇脚本语法

如何在动作脚本中将二进制内容发送到 servlet

cocos creater 简单的跳跃动作。

脚本-流程