2015-11-11 104 views
0

我試圖創建一個模塊,我可以實現一個計時器(解析雲代碼)。問題是它在最後的執行時間返回一個空值。我認爲它與無法檢索初始啓動變量有關。模塊返回值爲空?

我該如何做到這一點。謝謝!

var start; 
var end; 

exports.beginTimer = function beginTimer(functionName) { 

    //Start timing now 
    var start = new Date().getTime(); 
} 

exports.endTimer = function endTimer(functionName) { 

    //End timer 
    var end = new Date().getTime(); 
    var time = end - start; 
    alert('Execution time for' + functionName + ': ' + time); 
} 

回答

1

通過在方法中使用關鍵字「var」,您可以在方法本身的名稱空間中創建此變量。

這就是爲什麼在你的「beginTimer」方法中,你的變量已經在方法塊的末尾被刪除了。因此,使代碼正常工作的最簡單方法是從方法中的變量聲明中刪除「var」。

如果您在完成它們之前調用多個方法,可能會發生新錯誤,因爲它們都將使用相同的「開始」和「結束」。你可能想考慮在「functionName」和「start」之間使用某種映射。

例如,你可以這樣做:

var start = {}; 

exports.beginTimer = function beginTimer(functionName) { 

    //Start timing now 
    start[functionName] = new Date().getTime(); 

} 

exports.endTimer = function endTimer(functionName) { 

    //End timer 
    var end = new Date().getTime(); 
    var time = end - start[functionName]; 
    alert('Execution time for' + functionName + ': ' + time); 
} 

因爲當一個方法被調用了兩次就已經完成了,你可能會想和你傳遞給方法的唯一標識符來解決這個可能出現的新問題。

var start = {}; 

exports.beginTimer = function beginTimer(functionName, uid) { 

    //Start timing now 
    start[uid] = new Date().getTime(); 

} 

exports.endTimer = function endTimer(functionName, uid) { 

    //End timer 
    var end = new Date().getTime(); 
    var time = end - start[uid]; 
    alert('Execution time for' + functionName + ': ' + time); 
} 

您必須在您的方法中生成此UID。

+0

謝謝@jvecsei!我知道這已經超出了這個問題的範圍,但是可能會將提供的函數名和本地變量存儲在全局字典工作中(以抵消您提到的問題)? – KingPolygon

+0

我更新了我的答案,我希望這有助於。當你確定這個問題不會發生時,你不需要UID。 – jvecsei

+0

很高興我能幫到你。 – jvecsei

3

你重新聲明startend每個函數中。

這掩蓋全局變量與同名的局部變量。

endTimer得到undefined作爲值start

不要使用var,除非您想創建一個本地作用域變量。

+0

哇這樣的noob錯誤。謝謝。 – KingPolygon