动作脚本 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 中并不完全是一等公民,其结果之一是函数不保留自己的作用域,它必须在调用时与某个作用域相关联(通常与函数所在的作用域相同)本身已定义,除非您使用函数的 call
或 apply
方法)。
然后当函数被执行时,它内部的变量范围就是它碰巧被调用的范围——在你的例子中,你的循环之外的范围。这也是您可以这样做的原因:
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 函数的主要内容,如果未能解决你的问题,请参考以下文章