dha*_*0us 3 apache-flex oop actionscript actionscript-3
A.as :
public class A {
public function getFunction():Function {
return function():void {
if(this is C) {
trace("C");
} else {
trace("not C");
}
}
}
public function func1():void {
var internalFunc:Function = getFunction();
internalFunc();
}
}
B.as :
public class B extends A implements C {
}
Run Code Online (Sandbox Code Playgroud)
在其他一些课程中:
var b:B = new B();
B.func1();
Run Code Online (Sandbox Code Playgroud)
输出为:"不是C"
我期待跟踪输出为
"C"
有人可以解释原因吗?
一个匿名函数,如果直接调用,作用范围是全局对象.如果你this在里面追踪,你会看到[object global]而不是[object B]像你想的那样,而不是b.
常见的解决方法是使用闭包:
var self:A = this;
return function():void {
if(self is C) {
trace("C");
} else {
trace("not C");
}
}
Run Code Online (Sandbox Code Playgroud)
但请注意,定义匿名函数的类的实例成员可从内部获得.这是有效的,因为它们在编译时得到解决.
编辑以回应Amarghosh的问题:
是的,this指向全局对象,但这并不意味着,您无法访问声明类的实例成员.这段代码应该解释一下细节:
package {
import flash.display.Sprite;
public class Test extends Sprite {
private var foo:String = "foo";
public function Test() {
var anonymous:Function = function ():void {
trace(foo);//foo
trace(this.foo);//undefined
};
anonymous();
}
}
}
Run Code Online (Sandbox Code Playgroud)
greetz
back2dos