من میدانم که هیچ نمیدانم.
بررسی توابع IIFE ( Immediately Invoked Function Expressions) در جاوااسکریپت
سلام دوستان. یکی از مهمترین وظیفههای هر برنامهنویس اینه که بتونه از اطلاعات حفاظت کنه. توی یک زبان برنامهنویسی، اطلاعات شامل توابع و متغیرها میشن. یک برنامهی خوب، برنامهای هست که توی اون متغیرها سر جای خودشون قرار گرفته باشن. یعنی نباید بیش از حد نیاز قابل دسترس باشن و همچنین برای متغیرهای دیگه دردسرساز نشن. به طور خلاصه، قسمتهای یک برنامهی خوب، کپسوله (Encapsulated) هست.
توی این پست میخوایم یکی از روشهای داشتن یک برنامهی کپسوله شده رو یاد بگیریم. اسم این روش IIFE هست.
موارد زیر رو توی این قسمت یاد میگیریم:
- IIFE چیه
- چرا از IIFE استفاده کنیم
- پاس دادن آرگومان به تابع
- روشهای مختلف نوشتن IIFE
- استفاده از تابع با نام
IIFE چیه؟ ?
این یک مخفف برای عبارت Immediately Invoked Function Expression هست. یک اسم پیچیده، برای یک مفهوم بسیار ساده!
IIFE به تابعی گفته میشه که به محض تعریف شدن، اجرا میشه.
نحوه نوشتن اون به سادگی زیر هست:
(function () {
})();
همونطور که میبینیم، کافیه یک تابع بینام (Anonymous Function) رو بین دو پرانتز باز و بسته قرار بدیم و در پایان، یک پرانتر باز و بسته ()
بذاریم که باعث میشه تابع اجرا بشه.
داخل تابع میتونیم کار دلخواهمون رو انجام بدیم. خب کاربرد این روش چیه؟
چرا از IIFE استفاده کنیم؟
کپسوله کردن قسمتهای برنامه! همونطور که میدونیم، متغیرهایی که توی توابع تعریف میشن، دارای حوزه محلی (Local Scope) هستن. محصور کردن متغیرها توی یک تابع، ۲ خوبی داره:
۱. متغیرها فقط مخصوص همون تابع یا اسکوپ هستن و از بیرون تابع قابل دسترسی نیستن. یعنی:
(function () {
const x = 10;
})()
alert(x); // ReferenceError: x is not defined;
پس خیالمون راحته که متغیرهای ما امن هستن.
۲. متغیرهای گلوبال اسکوپ دستکاری نمیشن. یعنی:
const z = 20;
(function () {
const z = 10;
})()
alert(z); // 20
اینجا خیالمون راحته که متغیرهای حوزه بیرونی امن هستن.
پاس دادن آرگومان به تابع
به روش زیر میتونیم به این توابع آرگومان پاس بدیم:
(function (x, y) {
alert(x + y)
})(10, 20); // 30
میتونیم از همین روش، برای پاس دادن آبجکت سراسری this
استفاده کنیم:
// In browsers
(function (global) {
// ...
})(window);
// In Node
(function (global) {
// ...
})(global);
همونطور که میدونیم توی مرورگر، یک آبجکت سراسری به اسم window
و توی نود جیاس global
داریم. از روش بالا زمانی استفاده میکنیم که میخوایم کدهای ما توی محیطهای مختلف دستنخوره باقی بمونه و به قول معروف Hardcoded نشه.
روشهای مختلف نوشتن IIFE
میتونیم این توابع رو بصورت زیر هم بنویسیم:
(function () {
}());
همونطور که میبینیم، پرانتز اجرا کننده رو قرار دادیم داخل پرانتز محصور کننده. نوشتن به این روش هیچ تفاوتی با روش قبلی نداره.
خیلی از جاها دیدیم که این توابع رو بصورتهای زیر هم مینویسن:
;(function () {
}());
-(function () {
}());
+(function () {
}());
!(function () {
}());
~(function () {
}());
همه کارکترهایی که در ابتدای این عبارتها میبینید برای این قرار داده شدن که کد با خطا مواجه نشه. چطوری کد با خطا مواجه میشه؟ کد زیر رو در نظر بگیرید:
const x = "Hello"
(function () {
}());
با اجرا کردن این کد این خطا رو میگیریم:
TypeError: "Hello" is not a function
چون توی کد بالا، بعد از خط اول سمیکالن ;
نذاشتیم، کد ما به این صورت در نظر گرفته شد:
const x = "Hello"(...);
جاوااسکریپت فکر کرد که ما میخوایم تابعی به اسم Hello
رو اجرا کنیم. پس برای همین، همیشه سعی کنیم یا سمیکالنها رو بذاریم و یا از کارکترهای بالا در ابتدای IIFE استفاده کنیم.
استفاده از تابع با نام
میتونیم اسم این توابع رو هم مشخص کنیم:
(function mountain() {
}());
اسمگذاری این توابع، باعث نمیشه که بتونیم بعداً از اون استفاده کنیم و بیشتر برای خطایابی (Debugging) یا استفاده از خود تابع توی خودش به درد میخوره:
(function mountain() {
}());
mountain(); // ReferenceError: mountain is not defined
توی کد لازم داریم از تابع توی خودش استفاده کنیم:
(function mountain() {
mountain();
}());
کد بالا یک تابع بازگشتی هست که هیچ شرط پایانی نداره و بنابراین این کد بینهایت بار اجرا و باعث متوقف شدن برنامه میشه
میتونیم این توابع رو بریزیم توی یک متغیر:
const day = (function () {
return 4;
})()
alert(day) // 4
✔ باید در نظر داشته باشیم که توی کد بالا، ابتدا IIFE اجرا میشه و خروجی اون به متغیر day
نسبت داده میشه. پس مقدار day
تابع نیست:
const day = (function () {
return 4;
})()
alert(day()) // TypeError: day is not a function
خب دوستان این پست هم به پایان رسید. امیدوارم استفاده کرده باشین. روزتون خوش ?✌️
منبع:
همچنین بخوانید:
اسکوپ (scope) در جاوااسکریپت چیست؟
هویستینگ (Hoisting) در جاوااسکریپت چیست؟
بررسی (let - var - const) در جاوااسکریپت
تفاوت دو مساوی (==) و سه مساوی (===) در جاوااسکریپت
بررسی متدهای تعامل با کاربر در جاوااسکریپت : alert , prompt, confirm
استفاده از عبارت 'use strict' در جاوااسکریپت
کار با توابع یا Functions در جاوااسکریپت
مقایسه توابع Declarations و Expressions در جاوااسکریپت
بررسی Callback Function در جاوااسکریپت
تفاوت عملگرهای Spread و Rest در جاوااسکریپت
پارامتر پیشفرض(Default Parameter) در جاوااسکریپت
بررسی arguments در توابع جاوااسکریپت
بررسی پروتوتایپ (Prototype) در جاوااسکریپت
بررسی Arrow Functions در جاوااسکریپت
بررسی Functions Calling Other Functions در جاوااسکریپت
بررسی آرایه (Array) در جاوااسکریپت
بررسی اشیاء یا آبجکت (objects) در جاوااسکریپت
بررسی حلقهها (Loops) در جاوااسکریپت
بررسی انتخابگرها (Selectors) در جاوااسکریپت
بررسی innerHTML در جاوااسکریپت
بررسی DOM در جاوااسکریپت، آموزش متد querySelector
بررسی نحوه عملکرد جاوا اسکریپت در پشت صحنه
بررسی مفهوم Execution Context در جاوااسکریپت - پشت پرده جاوااسکریپت (بخش اول)
بررسی مفهوم Execution Context در جاوااسکریپت - پشت پرده جاوااسکریپت (بخش دوم)
تعریف API (Application Programming Interface) به زبان ساده!
دِستراکچرینگ (Destructuring) در جاوااسکریپت یعنی چه؟
بررسی عملگر (...) Spread در جاوااسکریپت
بررسی پارامترهای Rest در جاوااسکریپت
اتصال کوتاه (Short Circuiting) با عملگرهای منطقی AND و OR (||) در جاوااسکریپت
اتصال کوتاه (Short Circuiting) با عملگر منطقی Nullish coalescing (??) در جاوااسکریپت
حلقه for ... of در جاوااسکریپت
بررسی Enhanced Object literals در جاوااسکریپ
بررسی Optional Chaining (_.) در جاوااسکریپت
بررسی کاربرد Map و Set در جاوااسکریپت (مقدماتی)
بررسی کاربرد Map و Set در جاوااسکریپت (پیشرفته)
پارامتر پیشفرض (default parameter) در جاوااسکریپت
منظور از first class function در جاوااسکریپت
مطلبی دیگر از این انتشارات
سرویس کریپتویی جدید PayPal با قابلیت انتقال به سایر ولتها!
مطلبی دیگر از این انتشارات
ورود مستقل لاکپشتهای نینجا به صنعت NFT؛ طبق اعلام رسمی به زودی NFTهای لاکپشتهای نینجا منتشر خواهد شد!
مطلبی دیگر از این انتشارات
آموزش HTML - قسمت سوم (فرمت دهی ، فونت ها ، لینک ها و تصاویر)