سلام دوستان. یکی از مهمترین وظیفه‌های هر برنامه‌نویس اینه که بتونه از اطلاعات حفاظت کنه. توی یک زبان برنامه‌نویسی، اطلاعات شامل توابع و متغیرها میشن. یک برنامه‌ی خوب، برنامه‌ای هست که توی اون متغیرها سر جای خودشون قرار گرفته باشن. یعنی نباید بیش از حد نیاز قابل دسترس باشن و همچنین برای متغیرهای دیگه دردسرساز نشن. به طور خلاصه، قسمت‌های یک برنامه‌ی خوب، کپسوله (Encapsulated) هست.

توی این پست می‌خوایم یکی از روش‌های داشتن یک برنامه‌ی کپسوله شده رو یاد بگیریم. اسم این روش IIFE هست.

 

IIFE چیه؟ 🤔

این یک مخفف برای عبارت Immediately Invoked Function Expression هست. یک اسم پیچیده، برای یک مفهوم بسیار ساده!

IIFE به تابعی گفته میشه که به محض تعریف شدن، اجرا میشه.

نحوه نوشتن اون به سادگی زیر هست:

(function() {

})();

همونطور که می‌بینیم، کافیه یک تابع بی‌نام (Anonymous Function) رو بین دو پرانتز باز و بسته قرار بدیم و در پایان، یک پرانتر باز و بسته () بذاریم که باعث میشه تابع اجرا بشه.

داخل تابع می‌تونیم کار دلخواهمون رو انجام بدیم. خب کاربرد این روش چیه؟

 

چرا از IIFE استفاده کنیم؟

کپسوله کردن برنامه! همونطور که می‌دونیم، متغیرهایی که توی توابع تعریف میشن، دارای حوزه محلی (Local Scope) هستن. محصور کردن متغیرها توی یک تابع، ۲ خوبی داره:

۱. متغیرها فقط مخصوص همون تابع یا حوزه هستن و از بیرون تابع قابل دسترسی نیستن. یعنی:

(function() {
  var x = 10;
})()

console.log(x); // ReferenceError: x is not defined;

پس خیالمون راحته که متغیرهای ما امن هستن.

۲. متغیرهای حوزه سراسری دستکاری نمی‌شن. یعنی:

var z = 20;

(function() {
  var z = 10;
})()

console.log(z); // 20

اینجا خیالمون راحته که متغیرهای حوزه بیرونی امن هستن. برای آشنایی با حوزه‌ها توی جاوااسکریپت می‌تونید پست زیر رو بخونین:

 

پاس دادن آرگومان به تابع

به روش زیر می‌تونیم به این توابع آرگومان پاس بدیم:

(function(x, y) {
  console.log(x + y)
})(10, 20)

می‌تونیم از همین روش، برای پاس دادن آبجکت سراسری this استفاده کنیم:

// In browsers
(function(global) {
  // ... 
})(window)

// In Node
(function(global) {
  // ... 
})(global)

همونطور که می‌دونیم توی مرورگر، یک آبجکت سراسری به اسم window و توی نود جی‌اس global داریم. از روش بالا زمانی استفاده می‌کنیم که می‌خوایم کدهای ما توی محیط‌های مختلف دست‌نخوره باقی بمونه و به قول معروف Hardcoded نشه.