ตัววนซ้ำเป็นวัตถุที่สามารถเข้าถึงคอลเลกชันข้อมูลตามลำดับ หนึ่งใน API ทั่วไปของมันคือวิธีต่อไป วิธีนี้ได้รับค่าถัดไปในลำดับ
ตัวอย่างตัววนซ้ำ
หัวข้อ: ฉันหวังว่าจะเขียนฟังก์ชั่นที่สะดวกซึ่งสามารถใช้พารามิเตอร์จำนวนเท่าใดก็ได้และสร้างตัววนซ้ำสำหรับค่าเหล่านี้
รหัสทดสอบเป็นสิ่งที่ดี:
var it = ค่า (,,,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
การวิเคราะห์: เนื่องจากฟังก์ชั่นค่าจำเป็นต้องได้รับพารามิเตอร์หลายตัวเราจึงต้องใช้วิธีการสร้างฟังก์ชั่นที่มีพารามิเตอร์ตัวแปรที่กล่าวถึงในส่วนก่อนหน้า จากนั้นวัตถุ Iterator ภายในวนซ้ำองค์ประกอบของวัตถุอาร์กิวเมนต์
รหัสเบื้องต้น
ค่าฟังก์ชัน () {var i =, n = arguments.length; return {hasnext: function () {return i <n;}, ถัดไป: function () {ถ้า (this.hasnext ()) {return arguments [i ++];} โยนข้อผิดพลาดใหม่ (ทดสอบด้วยรหัสทดสอบข้างต้น
var it = ค่า (,,,,,,,); it.next (); // undefinedit.next (); // undefinedit.next (); // undefinedit.next (); // undefined
การวิเคราะห์ข้อผิดพลาด
ผลลัพธ์การรันรหัสไม่ถูกต้องดังนั้นโปรแกรมการเข้ารหัสเริ่มต้นจะถูกวิเคราะห์ด้านล่าง
ค่าฟังก์ชัน () {var i =, n = arguments.length; // ไม่มีข้อผิดพลาดที่นี่อาร์กิวเมนต์คือวัตถุในตัวในค่าที่ส่งคืน {hasnext: function () {return i <n;}, ถัดไป: ฟังก์ชัน () {ถ้า (this.hasnext ()) } โยนข้อผิดพลาดใหม่ ("ถึงจุดสิ้นสุดแล้ว");}}}ข้อผิดพลาดอ้างอิงที่นี่คล้ายกับวัตถุที่ทำให้เกิดอาการปวดหัวอื่นมาก เมื่อจัดการกับการชี้นี้โดยปกติจะใช้ตัวแปรและบันทึกสิ่งนี้ที่ถูกต้อง จากนั้นใช้ตัวแปรนี้ที่อื่น จากนั้นการแก้ปัญหาวัตถุอาร์กิวเมนต์จะถูกปล่อยออกมาโดยใช้ตัวแปรเพื่อจัดเก็บดังนั้นจึงไม่มีปัญหากับการอ้างอิงถึงวัตถุอาร์กิวเมนต์
เข้ารหัสอีกครั้ง
ค่าฟังก์ชัน () {var i =, n = arguments.length, arg = อาร์กิวเมนต์; return {hasnext: function () {return i <n;}, ถัดไป: function () {ถ้า (this.hasnext ()) {return arg [i ++];} โยนข้อผิดพลาดใหม่ (เรียกใช้รหัสทดสอบ
var it = ค่า (,,,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
ผลลัพธ์จะเหมือนกับที่คาดไว้
คำใบ้
ระวังลำดับชั้นของฟังก์ชั่นการทำรังเมื่ออ้างถึงอาร์กิวเมนต์
ผูกการอ้างอิงที่กำหนดขอบเขตอย่างชัดเจนกับตัวแปรอาร์กิวเมนต์เพื่อให้สามารถอ้างอิงได้ในฟังก์ชันซ้อนกัน
ภาคผนวก 1: iterator
ตัววนซ้ำบางครั้งเรียกว่าเคอร์เซอร์ พวกเขาเป็นรูปแบบการออกแบบซอฟต์แวร์สำหรับการเขียนโปรแกรมอินเทอร์เฟซที่สามารถข้ามไปยังคอนเทนเนอร์และนักออกแบบไม่จำเป็นต้องใส่ใจเกี่ยวกับเนื้อหาของคอนเทนเนอร์
ไดอะแกรมคลาส UML
การใช้งาน iterator JS
ฉันมีความเข้าใจเล็กน้อยเกี่ยวกับรูปแบบการออกแบบ แต่ในโครงการเฉพาะมีหลายโครงการที่เป็นแบบจำลองโรงงานซึ่งไม่ค่อยได้ใช้ ต่อไปนี้เป็นการนำไปใช้อย่างง่าย มีบางอย่างผิดปกติ ยินดีต้อนรับสู่การสื่อสาร
รหัสมีดังนี้
รายการฟังก์ชัน () {this.data = [];} list.prototype = {add: function () {var args = []. slice.call (อาร์กิวเมนต์) this.data = this.data.concat (args); }, ลบ: ฟังก์ชั่น (i) {this.data.splice (i,);}, iterator: function () {return ใหม่ iterator (this);}}} iterator function (รายการ) {this.list = list; this.cur =;}; this.cur <this.list.data.length-;}, next: function () {ถ้า (this.hasnext ()) {return this.list.data [this.cur ++];} โยนข้อผิดพลาดใหม่ ( มัน = list.iterator (); list.add (,,,,,,,); it.next (); // it.next (); // it.next (); //ข้างต้นเป็นวิธีการใช้ตัวแปรเพื่อบันทึกอาร์กิวเมนต์วัตถุใน JS แนะนำให้คุณรู้จัก ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน!