2

在 as3 中,有一种灵活的方法可以在调用对象实例时更改它。可以使用特定的第一个参数调用函数对象的调用或应用成员,并且引用说我们,这个第一个参数将是函数内部的“this”指针。但我发现它错了。

我写了一些小测试,如下所示。

public class Test 
{
  private var name:String = "default";
  public var test3:Function = test;
  public var test2:Function = function()
  {
    trace(this.name);
  }

  public function Test(name:String) 
  {
    this.name = name;
  }

  public function test():void
  {
    trace(this.name);
  }
}

并对其进行了测试。

var tmp:Test = new Test("default");
tmp.test();  //out default
tmp.test.call(new Test("new"));  //out default

tmp.test2(); //out default
tmp.test2.call(new Test("new2")); //out new2

tmp.test3(); //out default
tmp.test3.call(new Test("new3")); //out default

因此,在匿名函数调用中,我们可以获得正确的输出,但在成员函数的情况下则不行。也许是因为模棱两可的“this”指针,它应该为正确的工作提供真实的对象实例,也许还有其他的。我现在不知道,as3 参考并没有描述它。

最后列出问题:

  1. 为什么这样?对我来说,这很奇怪,看起来像是未定义的行为;
  2. 我怎样才能实现该功能?如何欺骗匿名测试功能?不是调用方法目标吗?

这不是很重要,但我会很高兴任何好的答案。谢谢!

PS对不起我的英语。

//已编辑:将此语句添加到所有“名称”引用中。没有什么变化。

4

1 回答 1

2

调用 [[Call]] 属性时,不同类型的闭包的行为是不同的。闭包是一个包含对方法的引用的对象,并且 [[Call]] 属性的行为不同,具体取决于它是函数、方法还是类闭包。函数闭包是一个与类的任何实例都不相关的全局方法。方法闭包包含一个类的实例方法,并且将始终记住它的原始“this”值。

如果闭包是函数闭包,则传递给 [[Call]] 的第一个参数将传递给方法并用作“this”值。如果第一个参数为 null 或未定义,则全局对象将用作方法的“this”值。

如果闭包是一个方法闭包,那么 [[Call]] 的第一个参数将被忽略,并且为方法闭包保存的“this”值将作为第一个参数传递给该方法。方法闭包记录其原始“this”值是什么,并且始终使用该值而不是 [[Call]] 的第一个参数。

如果闭包是类闭包,并且有 1 个参数传递给 [[Call]](除了 "this" 参数),则调用被视为类型转换,参数将被强制转换为类型由闭包表示。

http://learn.adobe.com/wiki/display/AVM2/2.4+Method+invocation+notes

于 2012-08-16T00:30:11.053 回答