2015-05-28 332 views
-1

我遇到一個coffeescript問題,當我通過js2.coffee將一個javascript函數轉換爲coffeescript函數時,我在控制檯中得到一個錯誤,告訴我它不是一個函數。當我將coffeescript翻譯回javascript時,我發現它不是一個函數,但它是一個變量。任何幫助將不勝感激!coffescript函數 - 不是函數

這是我的js函數

function enterPasture (goat, xpos, ypos) { 
    map.addChild(goat); 
    goat.x = mapToPixelX(xpos, ypos); 
    goat.y = mapToPixelY(xpos, ypos);  
}; 

和這裏的CoffeeScript的翻譯

enterPasture = (goat, xpos, ypos) -> 
    map.addChild goat 
    goat.x = mapToPixelX(xpos, ypos) 
    goat.y = mapToPixelY(xpos, ypos) 
    return 

和這裏的翻譯回的javascript

var enterPasture; 

enterPasture = function(goat, xpos, ypos) { 
    map.addChild(goat); 
    goat.x = mapToPixelX(xpos, ypos); 
    goat.y = mapToPixelY(xpos, ypos); 
}; 
+0

是什麼「它」的意思是「*在控制檯告訴我這是不是一個函數*一個錯誤」?你能告訴我們確切的消息嗎? – Biffen

+0

未捕獲TypeError:enterPasture不是函數 – Jeff

+0

@Jeff您究竟如何獲取此錯誤?你知道你不能直接在瀏覽器中執行CS嗎? –

回答

3

這裏沒有轉換錯誤。

function name(){... 

是一種快捷方式,聲明變量並將函數賦值爲該變量的值。當寫在一個功能或文件的開始時,它是相當於

var name; 
name = function(){... 

在JavaScript中,函數是"first class citizens",這意味着它們是有效的值,並且可被分配給變量。

現在,如果您嘗試呼叫功能之前該塊出現問題。它與第一個符號一起工作,因爲函數聲明在範圍的開始處爲hoisted,但它不適用於後者,因爲只有聲明(var name;)而不是分配(name = function(){...)被掛起。這可能是你的問題。

+0

@aduch是的,我試圖找到一種方法來清楚地說明(請參閱我的編輯) –

+0

同意,要清楚地說明它並不容易:「如果在聲明之前調用了函數,那麼它只會使用形式'function name()'「 – axelduch

0

沒關係,我想通了,該函數獲取調用它被定義之前,對不起大家