반복자는 순서대로 데이터 컬렉션에 액세스 할 수있는 객체입니다. 일반적인 API 중 하나가 다음 방법입니다. 이 방법은 순서에서 다음 값을 얻습니다.
반복자 예제
주제 : 여러 매개 변수를 취하고 이러한 값에 대한 반복자를 만들 수있는 편리한 기능을 작성하고 싶습니다.
테스트 코드가 좋습니다.
var it = value (,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
분석 : 값 함수는 여러 매개 변수를 수신해야하므로 이전 섹션에서 언급 된 변수 매개 변수가있는 함수를 구축하는 방법을 사용해야합니다. 그런 다음 반복자 객체 내부는 인수 객체의 요소 위로 반복됩니다.
예비 코드
함수 값 () {var i =, n = arguments.length; return {hasnext : function () {return i <n;}, 다음 : function () {if (this.hasnext ()) {return arguments [i ++];} 새 오류 ( "끝에 도달했습니다")}}}.위의 테스트 코드로 테스트하십시오
var it = value (,,,,); it.next (); // undefinedit.next (); // undefinedit.next (); // undefinedit.next (); // undefined
오류 분석
코드 실행 결과는 정확하지 않으므로 초기 인코딩 프로그램은 아래에서 분석됩니다.
함수 값 () {var i =, n = arguments.length; // 여기에는 오류가 없으며, 인수는 값의 내장 객체입니다 {hasnext : function () {return i <n;}, 다음 : function () {if (this.hasnext ()) {return arguments [i ++]; // 여기에 오류가 나타납니다. } 새 오류를 던지십시오 ( "끝에 도달했습니다");}}}여기서 참조 오류는 다른 두통 유발 객체와 매우 유사합니다. 이 포인팅을 다룰 때는 일반적으로 변수를 사용하고 올바른 것을 저장해야합니다. 그런 다음 다른 곳 에서이 변수를 사용하십시오. 그런 다음 인수 객체에 대한 솔루션이 변수를 사용하여 저장하기 위해 릴리스되므로 인수 객체에 대한 참조에는 아무런 문제가 없습니다.
다시 인코딩
함수 값 () {var i =, n = arguments.length, arg = arguments; return {hasnext : function () {return i <n;}, 다음 : function () {if (this.hasnext ()) {return arg [i ++];} 새 오류를 던지십시오 ( "끝에 도달했습니다")}}}}}}}}}.테스트 코드를 실행하십시오
var it = value (,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
결과는 예상과 동일합니다.
힌트
인수를 언급 할 때 기능 중첩 계층을 조심하십시오
중첩 된 함수에서 참조 할 수 있도록 인수 변수에 대한 명시 적으로 범위를 가진 참조를 바인딩하십시오.
부록 1 : 반복자
반복자는 때때로 커서라고합니다. 이들은 프로그래밍을위한 소프트웨어 설계 패턴, 컨테이너에서 통과 할 수있는 인터페이스이며, 디자이너는 컨테이너의 내용에 관심을 가질 필요가 없습니다.
반복자 UML 클래스 다이어그램
반복자 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.prototype = {hasnext : function () {return this.cur <this.list.data.length-;}, 다음 : function () {if (this.hasnext ()) {return this.list.data [this.cur ++];} 새 오류를 던지십시오 ( '이미 끝났습니다 ~');}, 제거 : function () {this.list.remove (this.cur); it = list.iterator (); list.add (,,,,); it.next (); // it.next (); // it.next (); //위는 변수를 사용하여 인수 객체를 저장하는 JS에 소개되는 방법입니다. 나는 그것이 모두에게 도움이되기를 바랍니다!