null
null
خواندن ۵ دقیقه·۳ سال پیش

Closures در جاوا اسکریپت

سلام سلام. این اولین مقاله من توی ویرگول هست و امیدوارم خوشتون بیاد.

خب...

توی این مقاله میخوام راجع به کلوژر ها(closures) توضیحاتی بدم.


1- کلوژر چیه؟ کلوژر به اون فانکشن یا فانکشن هایی میگن که توسط یه فانکشن دیگه به شما برگشت داده میشه. مثلا فانکشن name به شما یه فانکشن lastName بر میگردونه و میتونید ازون استفاده کنید. در اینجا lastName کلوژر هست.

2- کلوژر ها چه فایده ای برای برنامه نویس دارن؟ یکی از فوایدش امنیت هست که وقتی رفتم سراغ توضیحات بیشتر، میفهمید چرا میگم امنیت. یکی دیگه از فوایدش اینه که میتونید اطلاعاتتون رو پایدار نگه دارید! در حالی که اگه از کلوژر استفاده نکنیم، اون متغیر ما توی فانکشن ایجاد میشه و وقتی فانکشن کارشو انجام داد پاک میشه. خیلی جالبه، نه؟ حالا در ادامه بیشتر توضیح میدم.

2- ویژگی کلوژر ها چیه؟ یکی از ویژگی هاش که خیلیا به همین دلیل ازش استفاده میکنن این هست که اولویت اولش متغیر های محلی اون فانکشن و بعد متغیر های گلوبال هست و این عالیه!



خب گفتم کلوژر به فانکشنی میگن که توسط یه فانکشن دیگه ریترن میشه. الان توی کد بهتون نشون میدم.

ساخت فانکشنی برای برگرداندن یک کلوژر
ساخت فانکشنی برای برگرداندن یک کلوژر

خط 2 تا 10، فانکشنی رو ساختم که به من یک کلوژر بر میگردونه. در واقع اول برای من "here is your closure:" رو لاگ میگیره بعد کلوژر فانکشن منو بر میگردونه. خط 7 تا 9 همون کلوژر فانکشنی هست که ازش میگفتم رو بر میگردونه به من. خط 13 اون فانکشن برگشت داده شده رو ذخیره میکنم که بعدا ازش استفاده کنم. چون فانکشن اجرا میشه موقع ذخیره کلوژر فانکشن، قبلش "here is your closure:" لاگ گرفته میش. البته اینم بگم که شما میتونید اینجوری getClosure()() هم از کلوژر فانکشنتون استفاده کنید ولی چون با هربار اینکارو کردن فانکشن getClosure دوباره اجرا میشه و خوانایی کد رو کمتر میکنه و کاربرد کلوژر رو نداره، من ترجیح میدم اون رو ذخیره کنم و احتمال میدم شما هم اینکار رو ترجیح بدید. من توی خط 17 از کلوژر فانکشنم استفاده میکنم. دقت کنید اینجا دارم از فانکشنی که توی خط 7 تا 9 به من برگشت داده میشه استفاده میکنم نه از خود فانکشن getClosure. پس "hello! im a closure :)" برای من لاگ گرفته میشه. به همین سادگی من از یک کلوژر فانکشن استفاده کردم :)




خب آیا کلوژر فانکشن فقط واسه این کار استفاده میشه؟! معلومه که نه! یادتونه از امنیت اطلاعات و استفاده و تغییر یک مقدار توی یک فانکشن حرف زدم؟ الان بهتون با یه مثال اونارو توضیح میدم.

امنیت  و پایداری اطلاعات توی یک فانکشن
امنیت و پایداری اطلاعات توی یک فانکشن

خب این فانکشن کارش اینه که با استفاده از کلوژر فانکشن، کلمه به متغیر بدنه فانکشن که sentence هست اضافه کنه. ولی این بار یه سری چیزای دیگه هم هست که باید بدونید.

میدونید که هربار که یه فانکشن صدا زده میشه، متغیر ها و چیزای دیگه که به وجود میان، با یه برند دیگه ساخته میشن(فکر کنم رسوندم منظورو) و بعد از به پایان رسیدن عملیات، اون متغیر ها و چیزای دیگه از بین میرن و دیگه اصلا وجود نخواهند داشت که بتونیم از تغییرات اعمال شده روشون استفاده کنیم. اینجاست که بحث ثابت بودن اطلاعات پیش میاد. چطور من میتونم هر لحظه به متغیر ساخته شده توی فانکشن دسترسی داشته باشم و اونو تغییر بدم اگه خواستم یا ازش استفاده کنم بدون اینکه نگران از بین رفتنش باشم؟ با کلوژر فانکشن. توی این کد دقیقا همینکار رو انجام میدیم. البته اینو بگم که تغییرات روی فانکشن اصلی ایجاد نمیشن. تغییرات روی کپی ای که از فانکشن گرفتیم اجرا میشن و شما میتونید هزار تا کپی از فانکشن getClosure بگیرید و ذخیره کنید و استفاده کنید ازشون که اینجا ما توی createSentences این کپی رو ذخیره کردیم و از کلوژر فانکشن ریترن شدش که روی کپی فانکشن اثر میزاره استفاده میکنیم. توی خط 17 تا 20، هر بار یه کلمه به sentence توی کپیش که createSentences هست اضافه میشه و درجا مقدار لحظه ای sentence لاگ گرفته میشه. این یعنی پایداری اطلاعات توی فانکشنمون! و این یعنی ما دیگه نیازی نداریم که یه متغیر گلوبال توی بدنه خود فایل جی اس تعریف کنیم! و این یعنی امنیت اطلاعات و کسی نمیتونه مقداری که توی sentence هست رو بگیرتش و فقط میتونه اونو ببینه و تغییرش بده تا زمانی که شما بخواید(ادامه داره هنوز :) ). و اینکار نگرانی شما رو که از دست دادن متغیر های توی بدنه فانکشن و امنیتشون هست رو از بین میبره! حتما این کد ها رو خودتون هم تست کنید.



تا اینجا به احتمال زیاد قشنگ فهمیدید و درک کردید که کلوژر فانکشن چی هست، به چه درد میخوره و چجوری ازش استفاده میشه. حالا یه چیز جالب تر. ما میتونیم چندین کلوژر فانکشن از یه فانکشن ریترن کنیم! چجوری؟ با استفاده از آبجکت ها.

برگرداندن مجموعه ای از کلوژر فانکشن ها(شاید واقعا این نباشه ولی من اینو بهش میگم :) )
برگرداندن مجموعه ای از کلوژر فانکشن ها(شاید واقعا این نباشه ولی من اینو بهش میگم :) )

میبینید؟ انصافا خیلی موضوع جالب و کاربردی ای هست این موضوع!

این دفه، فانکشن ما به جای یه دونه کلوژر فانکشن یه آبجکت 4 تایی از کلوژر فانکشن ها که به ترتیب کارایی هرکدوم عبارتند از: اضافه کردن کلمه به جمله، لاگ گرفتن جمله حال حاضر، حذف کلمه به مقدار مورد نیاز و برگرداندن جمله حال حاضر، برمیگردونه. و برای اینکه بهتون ثابت کنم تمام تغییرات، پایداری و امنیت توی کپی اون فانکشن ذخیره و انجام میشن، یه کپی دیگه از getClosure ریختم توی متغیر sentence2 و اگه شما این کد رو تست کنید، متوجه میشید در آخر مقادیر sentence توی sentence1 و sentence2 باهم دیگه فرق دارند. یه نکته خیلی مهم که نیازه بهتون بگم اینه که اگه یه کپی از فانکشنی که کلوژر فانکشن بر میگردونه گرفتید و ذخیره کردید توی یه متغیر و بعدش دقیقا همون متغیر حاوی کپی رو انتسابش دادید به یه متغیر دیگه، هر تغییری روی sentence هرکدوم اعمال بشه، روی بقیه هم اعمال میشه. چرا؟ چون قشنگ از یه برند هستند. این موضوع برای آرایه ها هم همچین چیزی هست. شما اگه دو تا متغیر بسازید و مقدار [1,2,3,4,5] رو بریزید تو هردوشون و مقایسه شون کنید مقدار false رو خواهید دید. ولی اگه به یکیشون [1,2,3,4,5] انتساب بدید و سپس خود همین متغیر رو توی متغیر دیگه بریزید و باهم مقایسه شون کنید، این دفعه مقدار true رو خواهید دید. چرا؟ چون از یه برند هستند و برند اولویت مقایسه هست. امیدوارم چرایی این موضوع رو به خوبی توضیح داده باشم و متوجه شده باشید.

اگه دوست داشتید لایک کنید مقاله مو. اگه دوست داشتید دنبال کنید من رو. اگه دوست داشتید یه کامنت مثبت و یا انتقاد منطقی بزارید واسم. خلاصه هرکاری دوست داشتید توی زندگیتون انجام بدید؛ هرکاری که به کسی آسیب نزنه و یا غمگینش نکنه :)

تا مقاله های بعدی خدا نگهدار



برنامه نویسیجاوا اسکریتClosuresکلوژر
همه چی دون نیستم ولی چیزایی که میدونم و بلد هستم رو به بقیه هم یاد میدم :)
شاید از این پست‌ها خوشتان بیاید