ActionScript2函数
我是一名经验丰富的程序员,但刚刚开始使用Flash/Actionscript。我正在从事一个项目,由于某些原因,需要我使用ActionScript2而不是3 当我运行以下程序时(我只是把它放在一个新flash项目的第一帧中),输出是3而不是1?我需要它是1 为什么“ii”变量的范围在循环之间继续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
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.
这也是我在回复中试图说的,但由于某些原因,代码被破坏,无法正确显示