Si por "no se ejecutará" quiere decir "no hará nada cuando se le llame más de una vez", puede crear un cierre:
var something = (function() {
var executed = false;
return function() {
if (!executed) {
executed = true;
// do something
}
};
})();
something(); // "do something" happens
something(); // nothing happens
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 :
function once(fn, context) {
var result;
return function() {
if (fn) {
result = fn.apply(context || this, arguments);
fn = null;
}
return result;
};
}
Me inclinaría a cambiar fn = null;a fn = context = null;. No hay ninguna razón para que el cierre mantenga una referencia a contextuna vez que fnse 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.