1

我是一位经验丰富的程序员,但刚开始使用 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]();
4

3 回答 3

2

不幸的是,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 最终是一种原型语言。一切看起来面向对象的东西都只是巧合。;D

于 2008-09-27T10:05:41.153 回答
0

不幸的是,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");
于 2008-09-26T21:54:57.790 回答
0

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

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
于 2008-09-29T13:41:05.427 回答