Un itérateur est un objet qui peut accéder aux collections de données en séquence. L'une de ses API typiques est la méthode suivante. Cette méthode obtient la valeur suivante dans la séquence.
Exemple d'itérateur
Sujet: J'espère écrire une fonction pratique qui peut prendre n'importe quel nombre de paramètres et créer un itérateur pour ces valeurs.
Le code de test est bon:
var it = valeurs (,,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
Analyse: Étant donné que la fonction de valeurs doit recevoir des paramètres multiples, nous devons utiliser la méthode de création d'une fonction avec des paramètres variables mentionnés dans la section précédente. Ensuite, l'objet Iterator à l'intérieur itérate sur les éléments de l'objet Arguments.
Code préliminaire
Fonction Values () {var i =, n = arguments.length; return {Hasnext: function () {return i <n;}, next: function () {if (this.hasnext ()) {return arguments [i ++];} lance une nouvelle erreur ("il a atteint la fin");}}}}Tester avec le code de test ci-dessus
var it = valeurs (,,,,,,); it.next (); // undefinedit.next (); // undefinedit.next (); // undefinedit.next (); // indéfini
Analyse des erreurs
Le résultat en cours d'exécution du code n'est pas correct, donc le programme d'encodage initial sera analysé ci-dessous.
Les valeurs de fonction () {var i =, n = arguments.length; // il n'y a pas d'erreur ici, les arguments sont l'objet intégré dans les valeurs return {Hasnext: function () {return i <n;}, next: function () {if (this.hasnext ()) {return arguments [i ++]; // L'erreur apparaît ici, les arguments sont l'objet intégré de la fonction suivante de la méthode suivante. } lancer une nouvelle erreur ("il a atteint la fin");}}}L'erreur de référence ici est très similaire à un autre objet induisant les maux de tête. Lorsque vous traitez ce pointage, il s'agit généralement d'utiliser des variables et d'enregistrer le bon. Utilisez ensuite cette variable ailleurs. Ensuite, la solution à l'objet Arguments est libérée, en utilisant une variable pour la stocker, il n'y a donc aucun problème avec la référence à l'objet Arguments.
Encodage à nouveau
Fonction Values () {var i =, n = arguments.length, arg = arguments; return {Hasnext: function () {return i <n;}, next: function () {if (this.hasnext ()) {return arg [i ++];} lance une nouvelle erreur ("il a atteint la fin");}}}}Exécutez le code de test
var it = valeurs (,,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
Les résultats sont les mêmes que prévu.
indice
Méfiez-vous de la hiérarchie de nidification des fonctions lors de la référence aux arguments
Lier une référence explicitement portée à la variable des arguments afin qu'elle puisse être référencée dans une fonction imbriquée
Annexe 1: itérateur
Les itérateurs sont parfois appelés curseurs. Ce sont des modèles de conception de logiciels pour la programmation, des interfaces qui peuvent être traversées sur les conteneurs, et les concepteurs n'ont pas besoin de se soucier du contenu des conteneurs.
Diagramme de classe Iterator UML
Ilétateur JS Implémentation
J'ai une petite compréhension du modèle de conception, mais dans des projets spécifiques, il y en a beaucoup qui sont des modèles d'usine, qui sont rarement utilisés. Ce qui suit est une simple implémentation. Il y a quelque chose qui ne va pas. Bienvenue à communiquer.
Le code est le suivant
function list () {this.data = [];} list.prototype = {add: function () {var args = []. slice.call (arguments) this.data = this.data.concat (args); }, supprimer: fonction (i) {this.data.splice (i,);}, iterator: function () {return new iterator (this);}} function iterator (list) {this.list = list; this.cur =;}; iterator.prototype = {Hasnext: function () {return. this.cur <this.list.data.length -;}, next: function () {if (this.hasnext ()) {return this.list.data [this.cur ++];} lance une nouvelle erreur ('il est déjà terminé ~');}, retire: function () {this.list.remove (this.cur);}}} var list = new list (); it = list.iterator (); list.add (,,,,,,); it.next (); // it.next (); // it.next (); //Ce qui précède est la méthode d'utilisation des variables pour enregistrer des objets d'arguments dans JS qui vous sont introduits. J'espère que ce sera utile à tous!