2015-08-28 85 views
0

這是我的項目的一個非常簡化的版本。類屬性丟失範圍AND不能在setTimeout後設置

我有一個類文件:

class MyClass{ 

public var myNumberStoredInClass:Number; 

// constructor 
function MyClass(myNumber:Number){ 
    this.myNumberStoredInClass = myNumber; 
}; 

// some method 
function DoStuffMethod(){ 
    trace(this.myNumberStoredInClass); 
}; 

}; // end class 

我有,我可以等到我打電話的setTimeout在類中的方法與MyClass.myNumberStoredInClass沒有問題訪問this.myNumberStoredInClass正常。至於文件:

function ASFileFunction(){ 

    trace(MyClass.myNumberStoredInClass); // works fine 

    setTimeout(MyClass.DoStuffMethod, 7500); 

}; 

當在類文件中觸發DoStuffMethod時,myNumberStoredInClass的跟蹤返回'未定義'。我已經在.as文件中的許多其他函數中使用了該值,但是在setTimeout之後它已經丟失了。

什麼是真正奇怪的是,我可以改變DoStuffMethod以下和myNumberStoredInClass仍然未定義:

function DoStuffMethod(){ 

// I've tried watching this in debug mode and it just won't set, remains Undefined 


myNumberStoredInClass = 10; 

    trace(myNumberStoredInClass); // returns Undefined 
}; 

我在DoStuffMethod使用this.myNumberStoredInClass嘗試,但結果是一樣的。我只是無法設置或檢索變量!如果我在setTimeout之後立即執行跟蹤,那麼該值將在那裏,但是一旦setTimeout觸發,則無法設置該值。我不得不使用AS2來做到這一點。

任何想法?非常感謝。

編輯:試圖添加對象到setTimeout調用根據聖米格爾建議的文檔,但仍然是相同的結果。

+0

這是一個setTimeout範圍問題,看這裏,它是setInterval頁面,但setTimeout的範圍工作原理相同 http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00000600.html – gMirian

+0

謝謝。嘗試將對象添加到參數中,但仍然無法將該變量從Undefined更改。你是否介意在我的代碼中發佈一個例子,以防我沒有正確的語法? – Absinthe

+0

不幸的是我沒有Flash CS6來測試代碼,所以只能給出建議,嘗試使變量和函數靜態,例如靜態公共函數DoStuffMethod()和靜態公共var myNumberStoredInClass:Number; – gMirian

回答

0

關閉應該工作。您的代碼:

setTimeout(MyClass.DoStuffMethod, 7500); 

變爲:

setTimeout(function() { MyClass.DoStuffMethod() }, 7500); 

順便說一句,我認爲MyClass的是你的類,而不是你的類定義的實例。

這也應該工作:

function haveStuffDone() : void { 
    MyClass.DoStuffMethod(); 
} 
setTimeout (haveStuffDone, 7500); 

其中haveStuffDone是在同樣的情況下定義的函數調用的setTimeout從。

希望這會有所幫助。

+0

非常感謝,效果很好。在閱讀關閉之後,我不明白它是如何工作的,特別是:在我的原始代碼中,所有的類屬性在setTimeout之後失去了範圍。閉包確保「外」功能可用的變量可用於「內」功能......但這與我的班級有什麼關係?是否因爲閉合函數在setTimeout調用期間保留了類成員的範圍?再次感謝。 – Absinthe

+0

關閉「凍結」他們宣佈時可用的範圍。 看一看本頁:[as3-fundamentals/functions](http://www.adobe.com/devnet/actionscript/learning/as3-fundamentals/functions.html),然後搜索** Function關閉** - 該部分位於文本底部。儘管如此,該文本引用了一個缺失的示例:-( –

+0

偉大的鏈接,謝謝。對於其他人想知道這一點,我認爲該頁面的這一行很好地總結了它:「函數閉包是一個包含函數快照的對象及其詞彙環境,函數的詞彙環境包括函數作用域鏈中的所有變量,屬性,方法和對象及其值。「 – Absinthe