0

我显然在这里遗漏了一些东西。

我需要从数组中填充动态 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
  {
  };
4

3 回答 3

4

我猜问题出在范围val——你假设它的范围是 for 循环,但在 AS3 中不是这种情况,范围是函数。我是否正确,您所有的电话都返回 301?

更新:由于解决您遇到的问题(变量val被引用并且稍后才解决而不是被“复制”到您的函数中)非常麻烦:根据您的用例,您可以检查方法调用并查找使用Proxy提供的功能在表中获得所需的结果。

于 2009-09-10T21:47:27.327 回答
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)

于 2009-09-10T21:56:47.410 回答
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()
        );
     }
于 2009-09-10T22:01:52.187 回答