2015-01-31 90 views
1

我試圖用Scala.js來生成screep邏輯,但我遇到了以下錯誤,當我嘗試導入生成的JavaScript代碼:如何在使用Scala.js爲Screep生成邏輯時解決此錯誤?

TypeError: Cannot read property 'Object' of undefined 
at eval:1:358 
at screeplogic:45:322 
at m:4:3096 
at console:45 
at Object.c.runCode:4:6811 

首先,我創建了一個bare-骨頭Scala.js項目:

https://github.com/Voltir/screepslogic

我再聯繫我screep帳戶到回購,使用「生成」文件夾作爲鏈接的文件夾導入到遊戲中。

爲了得到這個錯誤,我開始一個自定義的模擬,然後在screep控制檯,並做了簡單的require("screeplogic")

+0

IIUC,你讓在Scala.js使Node.js的模塊? – sjrd 2015-01-31 22:06:50

+0

我不能肯定地說,但我懷疑screep遊戲引擎完全是在node中構建的,所以認爲我正在上傳的代碼(fullOpt'd Scala.js文件)正在被一個在節點中的eval調用。 – Voltaire 2015-02-01 18:23:26

+0

此外,到screep遊戲的鏈接在這裏:http://screeps.com/ – Voltaire 2015-02-01 18:24:27

回答

0

你的堆棧跟蹤表明錯誤是不是在Screeps代碼,但在你的:

TypeError: Cannot read property 'Object' of undefined 
at eval:1:358 
at screeplogic:45:322 <-- here it is 

如果您在screeplogic:45:322檢查指定的地方,你可以看到你的transpiler試圖與this變量調用產生的閉合功能:

(function() { ....... }).call(this); 

但在仿真模式下,全局上下文不存儲在this中,因此此調用失敗。如果你通過global變量明確,那麼一切似乎都很好地工作:

(function() { ....... }).call(global); 
+0

該轉譯器的輸出應該在所有情況下都給予'this',包括''global''是全局範圍的類節點環境。 (我知道是因爲我寫了ite。)它做的第一件事情之一是找出全局範圍是這樣的:https://github.com/scala-js/scala-js/blob/master/tools/ scalajsenv.js#L15-L19應該檢測「全局」情況。它在一個vanilla Node.js實例中很好用(我們在CI中測試了這個)。在Screep環境中似乎有些奇怪的東西使得這個邏輯有缺陷,但是什麼?我不知道。 – sjrd 2015-02-02 16:40:14

+0

我繼續前進,並將建議的更改手動應用於生成的JavaScript,只是爲了查看我是否能夠正常工作,並確實......有所作爲。我寫了一個快速測試頁面來檢查生成的代碼是幹什麼的,並且確實它生成了一個「module.exports」,在這種情況下,*應該*是一個函數......但是在screeps land中,它不再拋出一個錯誤,requrie(「screepslogic」)返回一個對象..我不能爲我的生活弄清楚這個對象的關鍵是什麼。 – Voltaire 2015-02-03 03:40:47

+0

編輯:另外,這是我的理解,要求(「screepslogic」)將返回任何「module.exports」被定義爲。 – Voltaire 2015-02-03 03:44:42