Solution élégante de Douglas Crockford, passé un certain temps à comprendre comment il fonctionne et je suis tombé sur ce fil.
Donc, l'emballage, une fois de retour de la fonction qui est juste invoque paramètre de la fonction que vous avez passé. Et, profitant de fermetures de cette construction remplacé passé de fonction de fonction vide, ou la valeur null dans la source d'origine, après le premier appel, de sorte que tous les prochains appels seront inutiles.
C'est quelque chose de très proche à toutes les autres réponses, mais c'est un peu de l'auto contenant du code et vous pouvez l'utiliser de façon indépendante, ce qui est bon. Je suis encore à essayer de saisir tout l'ensemble du dispositif de remplacement, mais en pratique, il fonctionne parfaitement.
function once (func) {
return function () {
var f = func;
func = null;
return f.apply(this, arguments);
};
}
function hi(name) {
console.log("Hi %s", name);
}
sayonce = once(hi);
sayonce("Vasya");
sayonce("Petya");
pour ceux qui sont curieux, voici jsbin transformations