2013-10-29 3 views
18

Non riesco a utilizzare setTimeout() per chiamare una delle mie funzioni. Posso usare setTimeout per chiamare alert(), ma non per una funzione che ho scritto io stesso. Ecco il codice più semplice che riproduce il problema:Come utilizzare setTimeout() in Coffeescript

Ho il seguente CoffeeScript

setTimeout(run, 1000) 

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

che genera il seguente Javascript

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

     setTimeout(run, 1000); 

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

    }).call(this); 

Non viene stampato niente alla console.

+0

Non so CoffeeScript ma sembra che il tuo tentativo di chiamare una funzione in cui si dovrebbe essere solo di passaggio dei parametri/ecc. –

risposta

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

si fa affidamento su javascript function hoisting per le funzioni dichiarate con la sintassi function run(){}, ma CoffeeScript li dichiara come variabili: var run = function(){}, quindi bisogna definire la funzione prima di riferimento, altrimenti è ancora undefined quando si passa a setTimeout.

12

Anonimo Opzione:

Peter ha esattamente ragione. Ma si può anche utilizzare setTimeout senza dichiarazione di una variabile:

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

Resa:

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

per quanto riguarda la garbage collection? possibile in una volta? – nottinhill

+0

Ciò che è fondamentale in questa risposta è che ci sono 4 spazi prima dell'istruzione 'console.log' in coffeescript. Se solo 2 spazi, non funzionerà. In Coffeescript ogni tabulazione o 2 spazi indenta un livello. – gm2008

+0

Su una riga: 'setTimeout ((-> someFunction()), 1000)' –