כשאני נתקלתי לראשונה בClosures זה היה באיזה קורס javascript קצר שעשיתי , וכבר בשיעור הראשון (או השני) מה שלמדנו היה Closures , אני זוכר שכל התלמידים היו מבולבלים מאד מהרעיון של Closures. אבל אם לומר את האמת זה היה צעד שהכניס את רובנו לעניינים מהר יחסית, מאז ועד היום אני פוגש לא מעט עבודה עם Closures, בעבודה, במבחני קבלה, וקטעי קוד שונים באינטרנט ועוד… וקיצור Closures הוא משהו שחשוב לדעת.
אז מה זה Closures ?
בהכי פשוט Closure הוא פונקציה שמחזירה פונקציה. כך שיש outer scope ו inner scope.
אם תחשבו על זה לרגע, גם המסמך שלכם , הסקופ הגלובלי , הוא סוג של Closure ברגע שהוספתם פונקציה כלשהי ומעלייה יהיה משתנה כלשהו. ובנימה יותר עמוקה – Lexical scoping , עם שימוש ב Closures נוצר מעיין סקופ נפרד כך שישנה פונקציה חיצונית שמתפקדת על הסקופ ההחיצוני שכן יכולה להשתנות בהתאם למשתנים שתעבירו לה מבחוץ, ופונקציה פנימית שעושה שימוש בסקופ זה. לכל Closure יש 3 היקפים:
- הסקופ הלוקלי שלה
- הסקופ של הפונקציה החיצונית
- והסקופ הגלובלי
הדבר מאפשר לנו לייצר סביבה נפרדת וגמישות ופוקציונאליות נחוצה לעבודה. ניתן כמה דוגמאות בסיסיות רק לצורך ההבנה:
דוגמאות ל Closures
לצורך הדוגמה נבנה חיבור בין שני מספרים עם Closure :
function combineNumbers(x){ return function(y){ return x+y; } } const one = combineNumbers(1); const ten = combineNumbers(10); console.log(one(1)) console.log(one(10))
אין הרבה משמעות מעשית לדוגמה, אלא יותר ברעיון שניתן לבנות פונקציה שמחזירה פונקציה (אנונימית במקרה הזה) וכן השימוש ביישום.
function combineNumbers(d){ const x = 5; return function(){ return x+d; } } const one = combineNumbers(1); const ten = combineNumbers(10); console.log(one()) console.log(ten()) console.dir(one)
דוגמה נוספת, אפשר להשתמש בסקופ של הפונקציה החיצונית ולהשתמש בפונקציה הפנימית שתחזיר ערך אחר.
אם תדפיסו console.dir של הפונקציה תוכלו לראות שהיא אכן Closure ומי הסקופ שלה:

דוגמאות מעשיות עם Closures
כל שימוש בפונקציה שמחזירה פונקציה היא למעשה closures עם זה fetch שמחזיר פרומיס כך שתחזירו מתוך then פונקציה, מדובר ב closure. כנל eventlistener , calbacks, higher-order functions .
לסיכום Closures
לא כל שפה מאפשרת גמישות כמו javascript וכן ברוב השפות כל תראו שימושים דומים ל closures , יש מקומות שמכנים זאת כ functional programing ומאד חשוב להכיר ולהבין את הנושא הזה . עוד מידע ודוגמאות תוכלו למצוא בקישור הזה מאתר mozilla המפורסם.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures