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 acontextuna vez quefnse 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
ifexpresión de prueba de declaración), JavaScript espera uno de los valorestrueofalsey 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 contenertrueofalse. (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.invalidateFunción reutilizable que funciona consetIntervaletc: 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
onceaceptar argumentos. Puede hacersquareo = _.once(square); console.log(squareo(1)); console.log(squareo(2));y obtener1ambas llamadas asquareo. ¿Estoy entendiendo esto bien?_.oncemé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
Oncese 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 nulles genial. Eso es lo que obtiene la segunda vez que invoca la función devuelta.invalidateFunció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
thislugar dewindowJQuery 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