我的背景在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