2010-12-22 22 views
14

¿Cuál de estas dos formas es más rápida y por qué?setTimeout() con cadena o referencia de función (anónima)? speedwise

window.setTimeout("func()", 100); 

O

window.setTimeout(function(){func();}, 100); 

supongo La segunda forma es más rápido si no por otra razón que no sea John Resig y todos los ninjas lo utilizan, supongo que porque ya analizada en contraposición a la primera manera que tendría que crear una nueva "cosa" de análisis. Recuerdo vagamente que esta es una de las razones por las que a la gente no le gusta eval().

Además, mientras lo tengo aquí, en el segundo snipplet de código, ¿el primer punto y coma se considera una buena práctica en tal caso?

Respuesta

22

Hay un tercio más rápido/opción más sencilla:

window.setTimeout(func, 100); 

... estrictamente relacionada con su pregunta, el segundo es más rápido, ya que sigue siendo una referencia - no una evaluación, que siempre es bastante caro. En cuanto al punto y coma, sí, es una buena práctica usarlos siempre. Nunca deberían haber sido IMO opcionales, pero muchos no estarán de acuerdo conmigo ... pero realmente no se puede argumentar en contra de ser explícito en tu código, eso siempre es una buena cosa .

+0

La tercera opción es solo cuando no hay argumentos – qwertymk

+0

@qwertymk - eso es correcto, pero no hay ninguno en sus ejemplos (y * la mayoría * de las veces que ve esto en el salvaje, también no lo son). –

+0

No conozco a nadie que no esté de acuerdo con usted sobre la inserción del punto y coma. – dheerosaur

0

No creo que ninguno de los dos sea más rápido en los navegadores modernos. Incluso si uno fuera algo más rápido, el mero hecho de que su código no llame a setTimeout con demasiada frecuencia hace que el argumento sea irrelevante.

El primero tiene la ventaja de ser más legible, y sería mi preferencia.

+1

La cadena podría ser un poco más legible, pero es * mucho * más insegura. –

+0

Bueno ... si va a hacer que su UI funcione, solicite al usuario que llame a la función o haga una solicitud HTTP para el nombre de la función, entonces sí, es inseguro. – martona

+0

@Greg, no es inseguro en absoluto ... –

2

Las personas que mencionas lo usan probablemente no porque sea más rápido.

  • código en la sintaxis alternativa, es una cadena de código que desea ejecutar después de milisegundos de retardo. (No se recomienda utilizar esta sintaxis por las mismas razones como el uso de eval())

De https://developer.mozilla.org/en/DOM/window.setTimeout

7

Como usted ha escrito que, ambos son igualmente "seguro". El problema de seguridad aparece cuando intenta pasar argumentos, porque hay una tentación de hacer cosas como esta:

setTimeout('func('+arg+')', 100); 

que tiene el potencial de inyección de código. Alguien lo va a usar para destruir tu estrella de la muerte. Tarde o temprano, un jedi joven descubrirá cómo engañar a tu aplicación para que haga arg igual a 3.14); deathStar.selfDestruct(, y lo siguiente que debes saber es que recibirás una llamada del Emperador para explicar tu error.

Y puede que no sea usted quien comete el error ... usted nunca haga algo tan tonto. Cuando su código se refactoriza 6 meses después por el pasante y necesitan agregar un argumento, es cuando surge el problema.

Por lo tanto, la forma de cadena se considera una mala práctica. Es más lento y potencialmente menos seguro.

+0

Es mejor hacer: setTimeout ("func", 100, arg); – Florent

4

El uso de 'setTimeout' con sintaxis de cadena internamente hace que el motor de JavaScript 'eval'. Cada vez que el navegador encuentra una 'evaluación' en algún lugar del código, no puede hacer muchas de las optimizaciones (y, por lo tanto, las desactiva) simplemente porque cualquier cosa puede entrar en eval.

Las optimizaciones como las variables de almacenamiento en caché no se pueden hacer con 'eval' existente en el código porque 'eval' puede introducir nuevas variables que serán ignoradas durante la fase de compilación de Javascript (donde detecta todas las declaraciones).

La segunda sintaxis es más rápida porque llamará a la función después de la demora y no se meterá en los males de 'eval'.

Cuestiones relacionadas