我在这里显然遗漏了一些东西。
我需要从数组中填充动态AS3类的方法(参见下面的愚蠢示例)。
但是当我调用这些方法时,它们看起来都是相同的方法。在下面的示例中,所有方法都是foobar1
。
如果我手动创建方法,没有循环,一切都很好。
任何线索?
package foo
{
public class Bar
{
public function testDynamicClassSanity():void
{
var foo:Foo = new Foo();
var methods:Object = { foobar1: 101, foobar2: 201, foobar3: 301 };
for (var key:String in methods)
{
var val:Number = methods[key];
foo[key] = function():Number
{
return val;
};
}
// Next trace prints
// 101 = 101 201 = 101 301 = 101
trace(
101, "=", foo.foobar1(),
201, "=", foo.foobar2(),
301, "=", foo.foobar3()
);
}
}
}
internal dynamic class Foo
{
};
答案 0 :(得分:4)
我猜这个问题出在val
的范围内 - 你假设它的范围是for循环,但在AS3中并非如此,范围就是函数。我是否更正你的所有电话都返回301?
更新:正在解决您遇到的问题(被引用的变量val
并且仅在以后解析而不是“复制”到您的函数中)非常麻烦:根据您的用例,您可以检查该方法使用Proxy提供的功能调用并在表中查找所需的结果。
答案 1 :(得分:2)
我认为你的问题是var变量的范围。试试这个修改:
for (var key:String in methods)
{
var val:Number = methods[key];
foo[key] = function (valInternal:Number) {
return function():Number
{
return valInternal;
};
}(val);
}
(以上技巧在Javascript中解决了类似的问题...我敢打赌它适用于AS3)
答案 2 :(得分:1)
对于记录,我将在此处发布testDynamicClassSanity()
函数的更正版本:
public function testDynamicClassSanity():void
{
var foo:Foo = new Foo();
var methods:Object = { foobar1: 101, foobar2: 201, foobar3: 301 };
// We have to introduce new scope
var makeCallback:Function = function(result:Number):Function
{
return function():Number
{
return result;
}
}
for (var key:String in methods)
{
foo[key] = makeCallback(methods[key])
}
// Prints as intended
// 101 = 101 201 = 201 301 = 301
trace(
101, "=", foo.foobar1(),
201, "=", foo.foobar2(),
301, "=", foo.foobar3()
);
}