مشخصات پیش نویس ECMAScript 6 در حال حاضر منابع بسیاری از شادی را برای توسعه دهنده مدرن جاوا اسکریپت به همراه داشته است. در پست قبلی تعدادی از کلاس های مجموعه جدید و for..of
های تکراری را پوشش دادیم. در این پست، ما قصد داریم در مورد چیزی صحبت کنیم که دست به دست هم می دهد for..of
loop: توابع ژنراتور.
در حال حاضر مجموعه ای از مواد عالی وجود دارد که چرایی و چگونگی استفاده از ژنراتورها را پوشش می دهد. به طور خلاصه، ژنراتورها توابع خاصی هستند که تکرارکنندهها را ایجاد میکنند، و تکرارکنندهها اشیایی هستند که متد next()
دارند که میتوان آن را برای به دست آوردن یک مقدار فراخوانی کرد. در یک تابع مولد، yield
کلمه کلیدی مقدار next()
را ارائه می دهد. با استفاده از yield
تعلیق اجرای تابع مولد، حفظ حالت تا next()
دوباره فراخوانی میشود، در این مرحله کد پشتیبانگیری میشود و ادامه مییابد تا زمانی که مقدار دیگری yield
(یا تا زمانی که تابع مولد خاتمه یابد). چندین مورد استفاده متعارف برای توابع مولد وجود دارد، مانند استفاده از آنها برای تکرار روی اعداد در دنباله فیبوناچی .
در حالی که اصول اولیه در راه نیست، بیایید با یک نمونه جاوا اسکریپت که برخی از ابهامات، یا «بیتهای نازک» کار با ژنراتورها را پوشش میدهد، عمیقتر برویم. نظرات گسترده ای در سراسر وجود دارد، و می توانید قبل از خواندن کد، با نسخه زنده آن بازی کنید:
بنابراین چند نکته مهم از کد چیست؟
اول، ساختن یک ژنراتور منجر به یک تکرار کننده منحصر به فرد با حالت متمایز خود می شود و می توانید پارامترهایی را به سازنده ژنراتور منتقل کنید که می تواند رفتار را کنترل کند.
دوم، میتوانید هنگام فراخوانی متد next()
یک iterator یک پارامتر را ارسال کنید، و آن مقدار به هر چیزی که در سمت چپ عبارت yield
از فراخوانی تکرارکننده قبلی است، اختصاص داده میشود. این یک راه عالی برای تغییر خروجی تکرارگر است - در اینجا، ما از آن برای کنترل بزرگ بودن یا نبودن کلمه ای که به دست می آید استفاده می کنیم. اگر میخواهید روی اولین مقداری که به دست میآید تأثیر بگذارید، این کار را از طریق یک پارامتر به سازنده ژنراتور انجام دهید.
در نهایت، ژنراتورها می توانند تکرار کننده های متناهی یا بی نهایت تولید کنند. اگر با یک تکرارکننده بینهایت کار میکنید، مطمئن شوید که بر اساس بازده yield
ed یک نوع شرط پایانی دارید—نوشتن تصادفی حلقههای بینهایت بسیار آسان است، بهویژه وقتی از for..of
برای تکرار استفاده میکنید. اگر با یک تکرار کننده متناهی از طریق فراخوانی next()
کار می کنید، ویژگی .done
شیئی که برگردانده شده است نشان می دهد که آیا تکرار کامل شده است یا خیر.
امیدواریم این نمونه، همراه با سایر منابع موجود در وب، کمی هیجان را به همراه داشته باشد و شما را به این فکر کند که چگونه می توانید از ژنراتورها در کد خود استفاده کنید. نسخههای فایرفاکس که با 31 شروع میشوند و کروم با 39 شروع میشوند، بهطور بومی از ژنراتور پشتیبانی میکنند. پروژه Regenerator پشتیبانی ژنراتور را برای مرورگرهای دیگر ارائه می دهد و استفاده از Traceur نیز یک گزینه است.
با تشکر از اریک آرویدسون برای کمک او در بررسی این مقاله.