Se por "não será executado" você quiser dizer "não fará nada quando for chamado mais de uma vez", você pode criar um encerramento:
var something = (function() {
var executed = false;
return function() {
if (!executed) {
executed = true;
// do something
}
};
})();
something(); // "do something" happens
something(); // nothing happens
Em resposta a um comentário de @Vladloffe (agora excluído): Com uma variável global, outro código poderia redefinir o valor do sinalizador "executado" (qualquer nome que você escolher para ele). Com um encerramento, outro código não tem como fazer isso, seja acidental ou deliberadamente.
Como outras respostas aqui apontam, várias bibliotecas (como Underscore e Ramda ) têm uma pequena função de utilidade (normalmente chamada once()
[*] ) que aceita uma função como um argumento e retorna outra função que chama a função fornecida exatamente uma vez, independentemente de como muitas vezes a função retornada é chamada. A função retornada também armazena em cache o primeiro valor retornado pela função fornecida e o retorna nas chamadas subsequentes.
No entanto, se você não estiver usando essa biblioteca de terceiros, mas ainda quiser essa função de utilitário (em vez da solução nonce que ofereci acima), é fácil de implementar. A versão mais legal que vi é esta postada por David Walsh :
function once(fn, context) {
var result;
return function() {
if (fn) {
result = fn.apply(context || this, arguments);
fn = null;
}
return result;
};
}
Eu estaria inclinado a mudar fn = null;
para fn = context = null;
. Não há razão para o fechamento manter uma referência a context
uma vez fn
que foi chamado.
[*] Esteja ciente, entretanto, que outras bibliotecas, como esta extensão do Drupal para jQuery , podem ter uma função chamada once()
que faz algo bastante diferente.