2012-04-08 18 views
5

Sto usando questo codice per avvolgere le parti del codice in esso viene utilizzato in questo modo,Come funziona questa funzione "ritardo" funziona

var delay = (function() { 
    // SET TIMER 
    var timer = 0; 
    // RETURN SET TIMEOUT FUNCTION 
    return function(callback, ms) { 
     clearTimeout(timer); 
     timer = setTimeout(callback, ms); 
    }; 
})();​ 

io lo chiamo così,

delay(function() { 
    ....... 
}, 1000); 

Ed lo farà ritardare di 1000 millisecondi, ma non capisco cosa sta succedendo grazie :)

+0

Suggerisco di chiederlo su http://codereview.stackexchange.com/ – Gerep

+0

Dai un'occhiata a ['clearTimeout'] (https://developer.mozilla.org/en/DOM/window.clearTimeout) e [ 'setTimeout'] (https://developer.mozilla.org/en/DOM/window.setTimeout). –

+1

Si potrebbe anche voler guardare la definizione della funzione anonima. Ecco un [collegamento] (http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work). – DiamRem

risposta

6

Il ritardo è una funzione che restituirà un'altra funzione. Le variabili del timer si trovano all'interno della chiusura della funzione di ritardo in modo che possa essere ancora acceduta dalla funzione di ritorno. La funzione. Si potrebbe anche scrivere in questo modo

var delay; 
var timer = 0; 
delay = function(callback, ms) { 
    clearTimeOut(timer); 
    timer = setTimeout(callback, ms); 
} 

Il problema che abbiamo ora è che se si chiama ritardo due volte si sovrascrive le variabili timer in modo che il secondo ritardo sovrascriverà la variabile timer. Ho provato questo fuori e sembra che la funzione è anche rotto dovrebbe essere:

var delay = function(){ 
// SET TIMER 
    var timer = 0; 
// RETURN SET TIMEOUT FUNCTION 
    return function(callback, ms){ 
     clearTimeout(timer); 
     timer = setTimeout(callback, ms); 
    }; 
}; 

delay()(function(){console.log("hello1");}, 5000); 
delay()(function(){console.log("hello2");}, 5000); 

Se il codice fa lo stesso sarà solo tracciare Hello2 perché il primo sovrascrive la variabile timer.

A meno che non si intenda che un secondo ritardo interromperà il primo ritardo, è necessario utilizzare un altro approuch.

+0

Grazie. Questo mi ha aiutato molto! – cgwebprojects

2

La prima cosa che questo codice fa è eseguire questa funzione (grazie allo () alla fine del codice che hai postato):

function() { 
    // SET TIMER 
    var timer = 0; 
    // RETURN SET TIMEOUT FUNCTION 
    return function(callback, ms) { 
     clearTimeout(timer); 
     timer = setTimeout(callback, ms); 
    }; 
}​ 

e memorizzare il risultato in delay. Quando viene eseguita, questa funzione crea una chiusura con la variabile locale timer che funge da contatore locale. La funzione restituisce quindi la funzione interna:

function(callback, ms) { 
    clearTimeout(timer); 
    timer = setTimeout(callback, ms); 
} 

Poiché è in chiusura, questa funzione interno ha accesso alla variabile timer. Nessun altro codice esterno può accedere a timer. Questo metodo viene utilizzato per consentire a più timer di essere eseguiti contemporaneamente senza doversi preoccupare di più variabili timer.

Immaginate in questo modo: delay ora contiene una funzione (function(callback, ms) {...) che ha accesso a una variabile locale, timer. La variabile timer è invisibile per quanto riguarda qualsiasi codice esterno. Solo la funzione che contiene delay può accedervi.

Quindi richiamare quella funzione interna chiamando delay(callback, timeout).

0

nel primo pezzo di codice u fare una variabile che è il ritardo e assegnare se il valore di ritorno di una funzione .. che a sua volta ritornare una funzione che è

return function(callback, ms) { 
     clearTimeout(timer); 
     timer = setTimeout(callback, ms); 
    } 

quindi questo è actly ur ritardo variabile. nw così quando u lo chiamano come ..

delay(function() { 
    ....... 
}, 1000); 

questo wud funziona come previsto ..
notare anche la () alla fine dove u assing la variabile delay .. che in javascript significa per eseguire una funzione come non appena viene rilevato, quindi quando viene eseguita la prima parte del codice che ho visto e alla variabile delay viene assegnata una funzione .. che chiama il secondo pezzo di codice

Problemi correlati