Ein Iterator ist ein Objekt, das sequentiell auf eine Datensammlung zugreifen kann. Eine typische API ist die nächste Methode. Diese Methode ruft den nächsten Wert in der Sequenz ab.
Iterator-Beispiel
Frage: Ich möchte eine praktische Funktion schreiben, die eine beliebige Anzahl von Parametern akzeptieren und einen Iterator für diese Werte erstellen kann.
Hier ist der Testcode:
var it=values(,,,,,,,,); it.next();// it.next();// it.next();//
Analyse: Da die Wertefunktion eine beliebige Anzahl von Parametern empfangen muss, müssen die im vorherigen Abschnitt erwähnten variablen Parameter empfangen werden Hier wird die Funktionsmethode verwendet. Dann durchläuft das darin enthaltene Iteratorobjekt die Elemente des Argumentobjekts.
Vorläufige Codierung
function values(){ var i=,n=arguments.length; return { hasNext:function(){ return i<n; }, next:function(){ if(this.hasNext()){ return arguments[i++]; } throw new Error("已经到达最后啦"); } } }
Test mit dem oben genannten Testcode
var it=values(,,,,,,,,); it.next();//undefined it.next();//undefined it.next();//undefined
Fehleranalyse
Ergebnisse beim Ausführen des Codes Dies ist nicht korrekt. Das anfängliche Codierungsverfahren wird im Folgenden analysiert.
function values(){ var i=,n=arguments.length;//这里没有错误,arguments是values里的内置对象 return { hasNext:function(){ return i<n; }, next:function(){ if(this.hasNext()){ return arguments[i++];//错误出现在这里,arguments是next方法函数的内置对象。 } throw new Error("已经到达最后啦"); } } }
Der Referenzfehler hier ist einem anderen Kopfschmerzobjekt sehr ähnlich, nämlich diesem. Wenn Sie mit dem Zeiger davon arbeiten, verwenden Sie normalerweise Variablen und speichern den korrekten Wert. Dann verwenden Sie diese Variable an anderer Stelle. Dann kommt die Lösung für das Argumentobjekt heraus, wobei eine Variable zum Speichern verwendet wird, sodass es kein Problem mit der Referenz des Argumentobjekts gibt.
Erneut kodieren
function values(){ var i=,n=arguments.length,arg=arguments; return { hasNext:function(){ return i<n; }, next:function(){ if(this.hasNext()){ return arg[i++]; } throw new Error("已经到达最后啦"); } } }
Der Referenzfehler hier ist einem anderen Kopfschmerz verursachenden Objekt sehr ähnlich, nämlich diesem. Wenn Sie mit dem Zeiger davon arbeiten, verwenden Sie normalerweise Variablen und speichern den korrekten Wert. Dann verwenden Sie diese Variable an anderer Stelle. Dann kommt die Lösung für das Argumentobjekt heraus, wobei eine Variable zum Speichern verwendet wird, sodass es kein Problem mit der Referenz des Argumentobjekts gibt.
Erneut codieren
function values(){ var i=,n=arguments.length,arg=arguments; return { hasNext:function(){ return i<n; }, next:function(){ if(this.hasNext()){ return arg[i++]; } throw new Error("已经到达最后啦"); } } }
Führen Sie den Testcode aus
var it=values(,,,,,,,,); it.next();// it.next();// it.next();//
Die Ergebnisse sind die gleichen wie erwartet.
Tipp
Achten Sie auf die Verschachtelungsebenen von Funktionen, wenn Sie auf Argumente verweisen
Binden Sie einen explizit bereichsbezogenen Verweis an die Argumentvariable, damit diese verschachtelt werden kann. Referenzieren Sie sie im Funktionssatz
Anhang 1: Iterator
Iterator (Iterator), manchmal auch Cursor (Cursor) genannt, ist ein Software-Entwurfsmuster in der Programmierung Durch die Schnittstelle am Container muss sich der Designer nicht um den Inhalt des Containers kümmern.
Iterator UML-Klassendiagramm
Iterator js-Implementierung
Ich weiß ein wenig über Designmuster, aber In bestimmten Projekten handelt es sich bei den meisten um Fabrikmodelle, andere werden nur selten verwendet. Das Folgende ist eine einfache Implementierung. Wenn etwas nicht stimmt, teilen Sie es bitte mit.
Der Code lautet wie folgt
function List(){ this.data=[]; } List.prototype={ add:function(){ var args=[].slice.call(arguments) this.data=this.data.concat(args); }, remove:function(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++]; } throw new Error('已经到底了~'); }, remove:function(){ this.list.remove(this.cur); } } var list=new List(); var it=list.iterator(); list.add(,,,,,,,,); it.next();// it.next();// it.next();//
Das Obige ist die Methode, die der Editor Ihnen vorstellt, wie Sie Variablen verwenden, um Argumentobjekte in JS zu speichern. Ich hoffe, dass dies der Fall sein wird hilfreich für alle!
Weitere verwandte Artikel zur Verwendung von Variablen zum Speichern von Argumentobjekten in JS finden Sie auf der chinesischen PHP-Website!