【发布时间】:2017-07-31 02:15:49
【问题描述】:
我的背景是 JavaScript。我对 ES5 和 ES6 都有非常深入的了解。在工作中,我最近被分配了一个项目,该项目涉及一个使用 AS2 的旧闪存应用程序。据我了解,ActionScript 与 ES5 非常相似,但具有类和可选的严格类型(类似于 TypeScript 和 Flow),以及一些其他经典的 OO 特性。到目前为止它相当简单,但我无法理解 this 和引用如何在 ActionScript 中工作。
这是我对 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
此外,ActionScript 标准库似乎没有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 处理程序的闭包不包含对@987654339 的引用@实例。
【问题讨论】:
-
AS2 有点像 ES3。 AS3 基于废弃的 ES4 规范(在类等方面规则不同)。也没有像
Function.prototype.bind这样的 ES5+ 特性。 -
this在 ES 中只是指由当前函数/方法 eval 确定的当前执行上下文,还有this引用window的全局执行上下文。
标签: javascript flash actionscript