Maison  >  Article  >  interface Web  >  Une brève analyse des compétences Javascript Memoizer_javascript

Une brève analyse des compétences Javascript Memoizer_javascript

WBOY
WBOYoriginal
2016-05-16 16:33:551226parcourir

Ce qui suit provient de l'implémentation de John Hann. Ce code a attiré mon attention. Il utilise une méthode intelligente pour mettre en cache les résultats des appels de méthode.

Analyse du code :

Copier le code Le code est le suivant :

// memoize : Une méthode générale de mise en cache utilisant la mémoisation
// func : méthode à mettre en cache
// contexte : contexte d'exécution de la méthode
// Remarque : La méthode doit être accessible de l'extérieur et les paramètres doivent être sérialisables en caractères
fonction mémoize (func, contexte) {
Function memoizeArg (argPos) { //Le paramètre indique la position du paramètre dans la méthode d'origine
           var cache = {}; //La clé de ce cache est le paramètre, et la valeur est le résultat de l'exécution
          return function () { //Renvoie une fermeture de fonction
If (argPos == 0) { //Le premier paramètre, si le paramètre n'existe pas dans la clé mise en cache, exécute la fonction d'origine et stocke le résultat de l'exécution
If (!(arguments[argPos] dans le cache)) {
cache[arguments[argPos]] = func.apply(contexte, arguments
);                                                                                                                        return cache[arguments[argPos]];
                                                                                                                    Sinon {// n'est pas le premier paramètre. Si le paramètre n'existe pas dans la clé de cache, il exécute de manière récursive la méthode Memoizearg. La position du paramètre dans la méthode d'origine-1
. If (!(arguments[argPos] dans le cache)) {
cache[arguments[argPos]] = memoizeArg(argPos - 1
);                                                                                                                                             return cache[arguments[argPos]].apply(this, arguments);
                                                                                                                               }
}  
var arity = func.arity || func.length; //La longueur du paramètre func, l'attribut length est utilisé en JavaScript et l'attribut arity est utilisé pour les autres
Return memoizeArg(arity - 1); //Recurse du dernier paramètre
>



Utilisation :


Copier le code

Le code est le suivant : var mem = memoize(func, this); alert(mem.call(this,1,1,2)); alert(mem.call(this,2,1,2));
alert(mem.call(this,3,1,3));
alert(mem.call(this,2,2,4));



Cela semble simple, mais cela n'est peut-être pas facile à comprendre au premier coup d'œil. Cependant, si vous êtes familier avec l'utilisation des fermetures, ce sera facile à comprendre. Après les plusieurs appels ci-dessus à mem.call, un arbre est formé, chaque nœud est une fermeture, chaque fermeture a un cache et la clé de chaque cache est une branche d'arbre :

(Remarque : le "résultat" dans l'image ci-dessus est également une fermeture, mais argPos est 0)

Mais il existe de nombreuses façons, par exemple, limbboy a dit :

Copier le code

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn