ActionScript 2功能
时间:2020-03-06 14:48:39 来源:igfitidea点击:
我是一位经验丰富的程序员,但是刚开始使用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]();
解决方案
不幸的是,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");
不幸的是,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