2011-12-19 29 views
7

Teraz przechodzę do pisania całego kodu javascript za pomocą Coffeescript, ale jestem sfrustrowany, ponieważ najprostszy z przykładów powoduje problemy. Jak na razie, zrobiłem więcej niż godzinę badań, nie będąc w stanie znaleźć odpowiedź na to pytanie ...Dlaczego ta funkcja nie działa przy użyciu 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> 

Jak wynika z powyższego kodu, po prostu staramy się uczynić wywołanie funkcji sayHi() działa z poziomu gotowego programu obsługi jQuery. Ale błąd Dostaję jest następujący:

Uncaught TypeError: niezdefiniowane nie jest funkcją

Proszę mi pomóc, Według kompilator i samouczków czytałem tę pracę „powinien” Ale ja nie wiem, co robię bardzo źle do tego, aby nie uruchomić :(

+0

Ostatni raz sprawdzałem, przeglądarek nie mają tłumaczy coffeescript ... lub jest to, że "coffee-sript.js" skrypt tłumaczenia kodu coffeescript do JavaScript? –

+0

Czy próbowałeś odwrócić dwie instrukcje? Nigdy nie pracowałem z CoffeeScriptem, ale zakładam, że jest to spowodowane faktem, że nazywasz metodę/funkcję zanim zostanie ona zdefiniowana (jak z powrotem w C). –

+0

@ Šime Vidas Co oznacza, że ​​to, co robię źle jest ....? – jlstr

Odpowiedz

11

text/coffeescript tagi odgrywają kluczową różnicę text/javascript tagów. oni nie „run” aż obciążeń dokumentów. to dlatego, że kawy biblioteka skryptów musi znaleźć wszystkie znaczniki skryptów kawy i skompilować je, a musi czekać do DOM r eady, więc może być pewnym, że je wszystkie znajdziesz.

Inną kwestią jest to, że jQuery natychmiast wywoła oddzwanianie do DOM-a, jeśli zdarzenie już się wydarzyło. I w tym przypadku tak jest.

Więc kiedy ten jest kompilowany do JS można uzyskać w ten sposób:

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

Więc co się dzieje, jest:

  • zadeklarować zmienną sayHi bez wartości, co czyni go undefined.
  • Utwórz wywołanie zwrotne DOM dla jQuery, które używa tej zmiennej.
  • jQuery natychmiast uruchamia funkcję zwrotną, ponieważ DOM gotowy już się wydarzył.
  • Funkcja wywołania zwrotnego wykonuje i próbuje uruchomić sayHi(), która jest wciąż niezdefiniowana.
  • Po uruchomieniu wywołania, sayHi jest następnie ustawiana na funkcję, którą chciałeś uruchomić.

Teraz, jeśli to był normalny tag JS, to mogło być uruchamiane przed załadowanego dokumentu, a następnie byłoby to działało w porządku, ponieważ przez czasu zwrotna rzeczywiście prowadził, a następnie sayHi zostałby prawidłowo przypisane.

Aby to naprawić, należy przypisać funkcję PRZED uruchomieniem podania w wywołaniu zwrotnym. Lub możesz pominąć wykonanie $(->) całkowicie, ponieważ już wiesz, że DOM jest gotowy do użycia. Ale tak naprawdę to jeden z głównych powodów, dla których nie powinieneś używać tagów coffeescript. To naprawdę nie to samo co przy użyciu znacznika JS. I jednym z wielu powodów, dla których nie jest to zalecane podejście do używania CoffeeScript na prawdziwej stronie internetowej.

więc skompilować coffeescript zanim przeglądarka widzi go jak odpowiedzialny deweloper :)

+0

Ale przeglądarka natychmiastowo wykonuje wszystkie elementy "

4

Flip oświadczenia. Wygląda na to, że CoffeeScript ma takie same ograniczenia jak stary dobry C, w którym nie możesz nawiązać połączenia z funkcją/metodą, dopóki nie zostanie zdefiniowana w porządku twojego kodu.

więc używać

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

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

Możesz sortować. To by zadziałało, gdyby nie to, że w tym przypadku callback działał od razu. Gdyby działał później, wszystko działałoby dobrze. –

Powiązane problemy