מפרט הטיוטה של ECMAScript 6 כבר הוביל להנאה מהרבה מפתחים של JavaScript. בפוסט הקודם עסקנו על כמה סוגי אוספים חדשים ועל for..of
לולאות של איטרציה. בפוסט הזה נדבר על משהו שפועל יד ביד עם לולאות של for..of
: פונקציות של מחולל.
קיים כבר מארח של חומרים מעולים שמסבירים למה ואיך להשתמש במחוללים. בקיצור, מחוללים הם פונקציות מיוחדות שיוצרות איטרטורים, ואיטרטורים הם אובייקטים עם שיטת next()
, שניתן לקרוא לה כדי לקבל ערך. בתוך פונקציית מחולל, מילת המפתח yield
מספקת את הערך של next()
. שימוש ב-yield
משהה את ההפעלה של פונקציית המחולל, תוך שמירה על המצב עד שתתבצע קריאה חוזרת ל-next()
, ואז הקוד מתחיל חזרה וממשיך עד שהוא yield
משנה ערך אחר (או עד לסיום פונקציית הגנרטור). יש מספר תרחישים קנוניים לדוגמה לפונקציות מחולל, כמו שימוש בהם כדי לחזור על מספרים שברצף פיבונאצ'י.
אם לא תסתכלו על היסודות, בואו נרחיב על זה עם דוגמת JavaScript שמכסה כמה מה'תפיסות', או "קטעים מסולסלים", של עבודה עם מחוללים. התהליך כולל תגובות מקיפות, ואתם יכולים לשחק עם הגרסה הפעילה של הקוד לפני שקוראים אותו:
אז מהן המסקנות החשובות מהקוד?
ראשית, בניית מחולל גורמת ליצירת איטרטור ייחודי עם מצב נפרד משלו, וניתן להעביר פרמטרים ל-constructor של המחולל שיכולים לשלוט בהתנהגות.
שנית, אפשר להעביר פרמטר כשקוראים ל-method next()
של איטרטור, והערך הזה יוקצה למה שמופיע בצד שמאל של ההצהרה yield
מההפעלה הקודמת של האיטרטור. זוהי דרך נהדרת לשנות את הפלט של האיטרטור - כאן נשתמש בו כדי לקבוע אם המילה שהתקבלה תהיה באותיות רישיות או לא. אם אתם רוצים להשפיע על הערך הראשון שנוצר, עשו זאת באמצעות פרמטר ל-constructor של המחולל.
לבסוף, גנרטורים יכולים לייצר איטרטורים סופיים או אינסופיים. אם אתם עובדים עם איטרטור אינסופי, צריך לוודא שיש לכם איזשהו תנאי סופי שמבוסס על הערך yield
ed – קל מאוד לכתוב בטעות לולאות אינסופיות, במיוחד כשמשתמשים ב-for..of
לביצוע איטרציה. אם אתם עובדים עם איטרטור סופי באמצעות קריאות ל-next()
, המאפיין .done
של האובייקט שמחזיר אותות מציין אם האיטרציה הושלמה.
אנחנו מקווים שהדוגמה הזו, יחד עם שאר המשאבים הזמינים באינטרנט, מעוררים התלהבות מסוימת וגורמים לכם לחשוב איך להשתמש במחוללים בקוד שלכם. גרסאות של Firefox מתחילות בגרסה 31 ומתחילות ב-39 מחוללי תמיכה במקור. בפרויקט ReGenerative יש תמיכה במחולל לדפדפנים אחרים, ואפשר גם להשתמש ב-Traceur.
תודה לאריק ארבידסון (Erik Arvidsson) על העזרה בקריאת המאמר הזה.