ActionScript2函数

ActionScript2函数,actionscript,actionscript-2,Actionscript,Actionscript 2,我是一名经验丰富的程序员,但刚刚开始使用Flash/Actionscript。我正在从事一个项目,由于某些原因,需要我使用ActionScript2而不是3 当我运行以下程序时(我只是把它放在一个新flash项目的第一帧中),输出是3而不是1?我需要它是1 为什么“ii”变量的范围在循环之间继续 var fs:Array = new Array(); for (var i = 0; i < 3; i++){ var ii = i + 1; fs[i] = functi

我是一名经验丰富的程序员,但刚刚开始使用Flash/Actionscript。我正在从事一个项目,由于某些原因,需要我使用ActionScript2而不是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]();
var-fs:Array=new-Array();
对于(变量i=0;i<3;i++){
var ii=i+1;
fs[i]=函数(){
微量元素(二);
}
}
fs[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");
var-fs:Array=new-Array();
对于(变量i=0;i<3;i++){
var ii=i+1;
fs[i]=函数(){
微量元素(二);
}
}
fs[0]();
跟踪(“超出范围:“+ii+”…但仍然有效”);

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

然后,当函数被执行时,它内部变量的作用域就是它被调用的地方的作用域——在您的例子中,就是循环外部的作用域。这也是为什么你可以这样做:

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

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

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
var-fs:Array=new-Array();
对于(var i=0;i<3;i++){
var ii=i+1;
f=函数(j){
返回函数(){
微量元素(j);
};
};
fs[i]=f(ii);
}
fs[0]()//1.
fs[1]()//2.
fs[2]()//3.

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