2012-04-08 18 views
5

Estoy usando este código para envolver partes de código en el que se utiliza de esta manera,¿Cómo funciona este "retraso" funciona

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

lo llamo así,

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

Y lo retrasará 1000 milisegundos, pero no entiendo lo que está pasando gracias :)

+0

Sugiero que lo pregunte en http://codereview.stackexchange.com/ – Gerep

+0

Eche un vistazo a ['clearTimeout'] (https://developer.mozilla.org/en/DOM/window.clearTimeout) y [ 'setTimeout'] (https://developer.mozilla.org/en/DOM/window.setTimeout). –

+1

Es posible que también desee ver la definición de función anónima. Aquí hay un [enlace] (http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work). – DiamRem

Respuesta

6

El retraso es una función que devolverá otra función. Las variables del temporizador se encuentran dentro del cierre de la función de retardo, por lo que aún puede ser accedida por la función de retorno. La función. También podría escribir como este

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

El problema que tenemos ahora es que si se llama retardo de dos veces que se sobreponen a las variables del temporizador de modo que el segundo retraso sobrescribirá la variable temporizador. Probé esto y parece que su función también está roto debe ser:

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); 

Si el código hace lo mismo que sólo se traza hello2 porque el primero se sobreponen a la variable temporizador.

A menos que su intención sea que una segunda demora detendrá la primera demora, debe usar una aplicación diferente.

+0

Gracias. ¡Esto me ha ayudado un montón! – cgwebprojects

2

Lo primero que hace este código es ejecutar esta función (gracias al () al final del código que ha publicado):

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

y almacenar el resultado en delay. Cuando se ejecuta, esta función crea un cierre con la variable local timer que se corta como un contador local. La función devuelve la función interna:

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

Dado que es en el cierre, esta función interna tiene acceso a la variable timer. Ningún otro código externo puede acceder al timer. Este método se usa para permitir que varios temporizadores se ejecuten a la vez sin tener que preocuparse por las variables múltiples timer.

Imagínelo así: delay ahora contiene una función (function(callback, ms) {...) que tiene acceso a una variable local, timer. La variable timer es invisible en lo que respecta a cualquier código externo. Solo la función que delay contiene puede acceder a ella.

A continuación, invoque esa función interna llamando al delay(callback, timeout).

0

en la primera pieza de código u hacer una variable que es el retraso y asignar a si el valor de retorno de una función .. que es a su vez el retorno de una función que es

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

así que esto es exacta- mente ur retraso varible. nw así que cuando u lo llaman como ..

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

este wud funciona como se esperaba ..
también notan la () al final donde u assing la variable delay .. que significa en javascript para ejecutar una función que pronto como se encuentra ... así que cuando la primera parte del código que he visto se ejecuta y la variable delay tiene asignada una función ... que llama en el segundo fragmento del código

Cuestiones relacionadas