2013-10-29 17 views
18

Nie mogę użyć funkcji setTimeout() do wywoływania jednej z moich własnych funkcji. Mogę użyć setTimeout do wywołania alertu(), ale nie funkcji, którą sam napisałem. Oto najprostszy kod, który reprodukuje problem:Jak korzystać z funkcji setTimeout() w Coffeescript?

Mam następujący coffeescript

setTimeout(run, 1000) 

    run =() -> 
     console.log("run was called!") 

który generuje następujące Javascript

// Generated by CoffeeScript 1.6.3 
    (function() { 
     var run; 

     setTimeout(run, 1000); 

     run = function() { 
     return console.log("run was called!"); 
     }; 

    }).call(this); 

Nic nie jest drukowane na konsoli.

+0

Nie wiem coffeescript ale wygląda na to próbujesz wywołać funkcję gdzie powinien być tylko przekazywania parametrów/itp. –

Odpowiedz

21
run =() -> 
    console.log("run was called!") 
setTimeout(run, 1000) 

jesteś powołując się na javascript function hoisting dla funkcji zadeklarowanych ze składnią function run(){}, ale coffeescript deklaruje je jako zmienne: var run = function(){}, więc trzeba zdefiniować funkcję przed odwoływać się do niej, w przeciwnym razie to wciąż undefined kiedy przekazać go do setTimeout.

12

Opcja anonimowa:

Peter ma dokładnie rację. Ale można też użyć setTimeout bez deklarowania zmiennej:

setTimeout -> 
    console.log 'run was called!' 
, 1000 

Wynik:

(function() { 
    setTimeout(function() { 
     return console.log("run was called!") 
    }, 1e3) 
}).call(this); 
+0

co powiecie na temat zbierania śmieci? możliwe za jednym razem? – nottinhill

+0

Najważniejsze w tej odpowiedzi jest to, że istnieją 4 spacje przed wyrażeniem 'console.log' w coffeescript. Jeśli tylko 2 spacje, to nie zadziała. W Coffeescript każda karta lub 2 spacje wcina jeden poziom. – gm2008

+0

W jednym wierszu: 'setTimeout ((-> someFunction()), 1000)' –

Powiązane problemy