2011-12-19 95 views
7

我現在正在向使用Coffeescript編寫所有JavaScript代碼的過渡,但是我很沮喪,因爲最簡單的示例導致了我的問題。截至目前,我已經做了比研究一個多小時,而能夠找到這個問題的答案...爲什麼這個函數調用不能使用Coffeescript?

<!DOCTYPE html> 
<html> 
<head> 
    <script src="http://code.jquery.com/jquery-latest.js"></script> 
    <script src="http://jashkenas.github.com/coffee-script/extras/coffee-script.js" type="text/javascript" charset="utf-8"></script> 
    <link href="sheet.css" rel="stylesheet" type="text/css" media="screen" /> 
    <script type="text/coffeescript"> 
    $ -> 
     sayHi() 

    sayHi = -> 
     alert 'Hi there!' 
    </script> 
</head>  
<body> 
    <div id="all"> 
    </div> 
</body> 
</html> 

如從上面的代碼清楚,我只是試圖使調用sayHi()函數在jQuery的ready處理程序中工作。但我得到的錯誤是:

遺漏的類型錯誤:未定義是不是一個函數

請幫助我,根據編譯器和教程我讀過這個「應該」工作,但我不知道我在做什麼可怕的錯誤,因爲它不運行:(

+0

我最後一次檢查,瀏覽器不具備的CoffeeScript翻譯...或者是,「咖啡sript.js」的劇本翻譯的CoffeeScript代碼爲JavaScript? – 2011-12-19 17:58:43

+0

您是否嘗試翻轉這兩條語句?我從來沒有使用過CoffeeScript,但我假設這是由於你在調用方法/函數之前已經調用過了(比如回到C) – 2011-12-19 17:59:44

+0

@ŠimeVidas這意味着我在做什麼錯了....? – jlstr 2011-12-19 18:00:15

回答

11

text/coffeescript標籤有一個關鍵區別text/javascript標籤,他們不運行,直到文檔加載,這是因爲咖啡腳本庫必須找到所有咖啡腳本標籤並編譯它們,並且必須等到DOM r所以它可以肯定地找到他們。

另一個問題是,如果事件已經發生,jQuery將立即觸發DOM就緒回調。在這種情況下,它已經。

所以,當這個被編譯成JS你得到這個:

var sayHi; 
$(function() { 
    return sayHi(); 
}); 
sayHi = function() { 
    return alert('Hi there!'); 
}; 

那麼什麼情況是:

  • 聲明sayHi變量沒有價值,使它undefined
  • 爲使用此變量的jQuery創建DOM就緒回調。
  • jQuery立即運行回調函數,因爲DOM準​​備已經發生。
  • 執行回調函數,並嘗試運行sayHi(),該函數尚未定義。
  • 回調運行後,sayHi被設置爲您想要運行的功能。

現在,如果這是一個正常的JS代碼,它可能加載文檔之前運行,然後因爲時間回調居然跑,然後sayHi會被正確分配它會工作得很好。

要修復它,您應該在回調中分配函數BEFORE您運行通過。或者你可以完全跳過$(->),因爲你知道DOM已經準備好了。但是,真的,這是你真的不應該使用coffeescript標籤的一個主要原因。這跟使用JS標籤不一樣。其中一個原因很多,這不是在真實網站上使用CoffeeScript的推薦方法。

您的瀏覽器中看到它像一個負責任的開發商:)

+0

但是瀏覽器立即執行所有'

4

翻轉的語句之前那麼編譯你的咖啡腳本。看起來像CoffeeScript和老C有着相同的限制,在這種情況下,只有在按照代碼的順序定義之前,您才能調用函數/方法。

所以使用

<script type="text/coffeescript"> 
    sayHi = -> 
    alert 'Hi there!' 

    $ -> 
    sayHi() 
</script> 
+0

你可以,呃。它會起作用,除非在這種情況下,回調立即運行。如果它後來運行,它會工作得很好。 – 2011-12-19 18:14:33

相關問題