我的背景在JavaScript中很重。我对ES5和ES6都有非常深入的了解。在工作中,我最近分配了一个涉及使用AS2的较旧Flash应用程序的项目。我的理解是,ActionScript与ES5非常相似,但具有类和可选的严格类型(类似于TypeScript和Flow)以及一些其他经典OO功能。目前为止相当简单,但我无法理解如何在ActionScript中使用this
和引用。JavaScript和ActionScript中的“this”之间的区别
这是我对JavaScript的理解。 this
在函数可以参考:
- 甲绑定变量,如果用Function.bind()(以及Function.call()和Function.apply()),其不能在绑定函数被改变,例如:
function func() {
return this.number;
}
var bound = func.bind({ number: 2 });
console.log(bound()); // 2
- 一个目的,如果被调用的函数作为对象的方法,例如:
function func() {
return this.number;
}
var obj = { number: 2, func: func };
console.log(obj.func()); // 2
- 一个类的实例中,如果该功能是在这个类的原型定义,例如:
function Class() {
this.number = 2;
}
Class.prototype.func = function func() {
return this.number;
}
console.log(new Class().func()); // 2
- 全局对象,如果调用函数时没有任何形式的结合或连接到它的对象或实例,例如:
var number = 2;
function func() {
return this.number;
}
console.log(func()); // 2
在ActionScript的事情似乎有点不同。一方面,你可以访问类的成员,而不this
,如果你是在该类的方法,类似于像C#和Java语言中这样做:
class MyClass {
private var number:Number = 2;
public function func():Number {
return number;
}
}
trace(new MyClass().func()); // 2
而且,动作脚本标准库似乎并不具备一个Function.bind()
方法,虽然它确实有Function.apply()
和Function.call()
,它们看起来像JavaScript变体一样工作:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/2/help.html?content=00001072.html#265677。也似乎没有原型,这是有道理的,因为基于我的理解,类是更抽象的语法结构而不是函数(就像C#/ Java)。
所以我的问题是,除了缺少Function.bind()
和Function.prototype
,ActionScript和JavaScript之间的规则是相同的吗?
另外,如果我这样做,会发生什么:
class SomeClip extends MovieClip {
private var childClip:MovieClip;
private var number:Number = 2;
public function SomeClip() {
this.onLoad = function() {
// SomeClip onLoad hander, `this` will be the SomeClip instance
childClip._visible = true; // How is childClip resolved here?
childClip.onRelease = function() {
// childClip onRelease handler, `this` will be childClip
trace(number); // How is number resolved here?
};
};
}
}
基本上,如果你在一个事件处理程序,或其他一些松散的函数,不是类的方法来访问的成员不this
什么发生?我猜想在第一种情况下,它将解析为this.childClip
并按照预期工作,但在第二种情况下,解决方案将失败,因为onRelease
处理程序的关闭将不包含对SomeClip
实例的引用。
AS2有点像ES3。 AS3基于废弃的ES4规范(规则在类和类似方面是不同的)。 ES5 +的功能都不像“Function.prototype.bind”。 –
ES中的'this'只是指当前的执行上下文,它由当前的函数/方法eval确定,并且存在'this'指向'window'的全局执行上下文。 – Li357