Necesito crear una función que se pueda ejecutar solo una vez, cada vez después de la primera no se ejecutará. Sé de C ++ y Java acerca de las variables estáticas que pueden hacer el trabajo, pero me gustaría saber si hay una forma más elegante de hacer esto.
javascript
function
design-patterns
vlio20
fuente
fuente
Respuestas:
Si por "no se ejecutará" quiere decir "no hará nada cuando se le llame más de una vez", puede crear un cierre:
En respuesta a un comentario de @Vladloffe (ahora eliminado): Con una variable global, otro código podría restablecer el valor de la bandera "ejecutado" (cualquier nombre que elija). Con un cierre, otro código no tiene forma de hacer eso, ya sea accidental o deliberadamente.
Como señalan otras respuestas aquí, varias bibliotecas (como Underscore y Ramda ) tienen una pequeña función de utilidad (normalmente llamada
once()
[*] ) que acepta una función como argumento y devuelve otra función que llama a la función proporcionada exactamente una vez, independientemente de cómo muchas veces se llama a la función devuelta. La función devuelta también almacena en caché el valor devuelto primero por la función proporcionada y lo devuelve en llamadas posteriores.Sin embargo, si no está utilizando una biblioteca de terceros, pero aún desea una función de utilidad (en lugar de la solución nonce que ofrecí anteriormente), es bastante fácil de implementar. La versión más bonita que he visto es esta publicada por David Walsh :
Me inclinaría a cambiar
fn = null;
afn = context = null;
. No hay ninguna razón para que el cierre mantenga una referencia acontext
una vez quefn
se ha llamado.[*] Tenga en cuenta, sin embargo, que otras bibliotecas, como esta extensión de Drupal para jQuery , pueden tener una función nombrada
once()
que hace algo bastante diferente.fuente
if
expresión de prueba de declaración), JavaScript espera uno de los valorestrue
ofalse
y el flujo del programa reacciona de acuerdo con el valor encontrado cuando se evalúa la expresión. Los operadores condicionales como==
siempre evalúan a un valor booleano. Una variable también puede contenertrue
ofalse
. (Para obtener más información, consulte la documentación sobre booleano , veraz y falsey .)Reemplácelo con una función NOOP (sin operación) reutilizable .
fuente
setInterval(foo, 1000)
- y esto ya no funciona. Simplemente está sobrescribiendo la referencia en el alcance actual.invalidate
Función reutilizable que funciona consetInterval
etc: jsbin.com/vicipar/1/edit?js,consoleApunta a una función vacía una vez que se ha llamado:
O, así:
fuente
setInterval()
), la referencia repetirá la funcionalidad original cuando se llame.UnderscoreJs tiene una función que hace eso, underscorejs.org/#once
fuente
once
aceptar argumentos. Puede hacersquareo = _.once(square); console.log(squareo(1)); console.log(squareo(2));
y obtener1
ambas llamadas asquareo
. ¿Estoy entendiendo esto bien?_.once
método. Ver jsfiddle.net/631tgc5f/1_
; No recomendaría depender de toda la biblioteca para un código tan pequeño.Hablando de variables estáticas, esto es un poco como una variante de cierre:
A continuación, puede restablecer una función si lo desea:
fuente
fuente
Simplemente puede hacer que la función "se elimine"
Pero esta puede no ser la mejor respuesta si no quiere tragar errores.
También puedes hacer esto:
Necesito que funcione como un puntero inteligente, si no hay elementos del tipo A, se puede ejecutar, si hay uno o más elementos A, la función no se puede ejecutar.
fuente
Once
se pasa como una devolución de llamada (por ejemplo,setInterval(Once, 100)
). Se seguirá llamando a la función original.prueba esto
fuente
De un tipo llamado Crockford ... :)
fuente
TypeError: Cannot read property 'apply' of null
es genial. Eso es lo que obtiene la segunda vez que invoca la función devuelta.invalidate
Función reutilizable que funciona consetInterval
:Pruébelo en JSBin: https://jsbin.com/vicipar/edit?js,console
Variación de respuesta de Bunyk
fuente
Aquí hay un ejemplo de JSFiddle: http://jsfiddle.net/6yL6t/
Y el codigo:
Podrías hacerlo:
Y solo se ejecutará una vez :)
fuente
Configuración inicial:
fuente
Si usa Node.js o escribe JavaScript con browserify, considere el módulo npm "once" :
fuente
Si desea poder reutilizar la función en el futuro, esto funciona bien según el código de ed Hopp anterior (¡me doy cuenta de que la pregunta original no requería esta función adicional!):
La salida se ve así:
fuente
decorador simple que es fácil de escribir cuando lo necesita
utilizando:
fuente
Intentando utilizar la función de subrayado "una vez":
http://underscorejs.org/#once
fuente
fuente
Si está utilizando Ramda, puede utilizar la función "una vez" .
Una cita de la documentación:
fuente
Mantenlo lo más simple posible
Puedes ver el resultado
fuente
this
lugar dewindow
JQuery permite llamar a la función solo una vez usando el método uno () :
Implementación usando el método JQuery en () :
Implementación usando JS nativo:
fuente
fuente
Este es útil para prevenir bucles infinitos (usando jQuery):
Si le preocupa la contaminación del espacio de nombres, sustituya "doIt" por una cadena larga y aleatoria.
fuente
Ayuda a prevenir la ejecución pegajosa
fuente