イテレーターは、順番にデータ収集にアクセスできるオブジェクトです。その典型的なAPIの1つは次の方法です。この方法は、シーケンスで次の値を取得します。
イテレーターの例
トピック:任意の数のパラメーターを使用して、これらの値のイテレーターを作成できる便利な関数を書きたいと考えています。
テストコードは良いです:
var it = values(,,,,,); it.next(); // it.next(); // it.next(); // it.next(); //
分析:値関数は複数のパラメーターを受信する必要があるため、前のセクションで説明した変数パラメーターを使用して関数を構築する方法を使用する必要があります。次に、引数オブジェクトの要素を繰り返します。
予備コード
function values(){var i =、n = arguments.length; return {hasnext:function(){return i <n;}、next:function(){if(this.hasnext()){return arguments [i ++];}新しいエラー( "終了に達しました");}}}}}上記のテストコードでテストします
var it = values(,,,,,); it.next(); // undefinedit.next(); // undefinedit.next(); // undefinedit.next(); // undefined
エラー分析
コードの実行結果は正しくないため、初期エンコードプログラムを以下に分析します。
function values(){var i =、n = arguments.length; //ここにはエラーがありません。引数は値の組み込みオブジェクトです{hasnext:function(){return i <n;}、next:function(){if(this.hasnext()){return arguments [i ++] ;/ここにエラーが表示されます。 }新しいエラーをスロー( "終了に達した");}}}ここでの参照エラーは、別の頭痛誘発オブジェクトに非常に似ています。このポイントに対処するとき、それは通常、変数を使用して、これを正しいものに保存することです。次に、他の場所でこの変数を使用します。次に、変数を使用してそれを保存するために、引数オブジェクトのソリューションがリリースされるため、引数オブジェクトへの参照に問題はありません。
もう一度エンコード
function values(){var i =、n = arguments.length、longth、arg = arguments; return {hasnext:function(){return i <n;}、next:function(){if(this.hasnext()){return arg [i ++];}スロー新しいエラー( "テストコードを実行します
var it = values(,,,,,); it.next(); // it.next(); // it.next(); // it.next(); //
結果は予想と同じです。
ヒント
引数を参照する際の機能のネスト階層に注意してください
ネストされた関数で参照できるように、引数変数への明示的にスコープされた参照をバインドします
付録1:イテレーター
イテレーターは、カーソルと呼ばれることもあります。これらは、プログラミングのソフトウェア設計パターン、コンテナで移動できるインターフェイスであり、設計者はコンテナのコンテンツを気にする必要はありません。
Iterator UMLクラス図
Iterator JS実装
私は設計モデルを少し理解していますが、特定のプロジェクトでは、工場モデルである多くのプロジェクトがあり、ほとんど使用されていません。以下は簡単な実装です。何か問題があります。コミュニケーションへようこそ。
コードは次のとおりです
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.protototototy = {hasnext:function(){return this.cur <this.list.data.length - ;}、next:function(){if(this.hasnext()){return this.list.data [this.cur ++];} shrow new error( 'それはすでに〜');}、削除:function(this.list.list.remove(this.cur); it = list.iterator(); list.add(,,,,,); it.next(); // it.next(); // it.next(); //上記は、変数を使用して、紹介されたJSの引数オブジェクトを保存する方法です。私はそれが誰にでも役立つことを願っています!