我在这里有一个非常简单的代码,解释了在使用函数的调用方法时我在AS2和AS3之间发现的差异。
var a = {name:"a"}
var b = {name:"b"}
function c()
{
trace(this.name)
}
c() // AS2: undefined AS3: root1
c.apply(a) // AS2: a AS3: root1
c.apply(b) // AS2: b AS3: root1
如何强制AS3尊重AS3中的thisObject参数?
这是Adobe文档 “http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Function.html#apply()”
由于
答案 0 :(得分:2)
重要的是要认识到Functions
与Methods
不同。 Methods
绑定到它们所定义的对象,而Functions
未绑定到任何对象。
当您在方法上使用apply
甚至call
时,您将从其实例中提取它,但它将始终绑定到该对象。
因此,在您的示例中,c()
位于对象内部,这就是您没有看到thisObject
更改的原因。
来自adobe on Methods:
方法是属于类定义的函数。曾经 创建类的实例,方法绑定到该实例。 与在类外声明的函数不同,不能使用方法 除了附加的实例
现在如果您希望能够更改thisObject
,可以在对象之外创建一个函数并传递新的thisObject
参数。这是一个非常基本的例子:
class myClass {
public function myBoundFunction():void {
trace( "Bound to: " + this );
}
}
//declared outside the class
function unboundFunction():void {
trace( "Unbound: " + this.name );
}
然后使用thisObject
参数实例化和应用函数:
var c:myClass = new myClass();
//bound function call
c.myBoundFunction.apply( this );
//unbound call
unboundFunction.apply( this );
<强>输出:强>
Bound to: [object myClass]
Unbound: root1