کلوز ECMAScript

یکی از نکات بیش از حد مبهم ECMAScript، پشتیبانی از کلوز (closure) است.

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

مثال ساده کلوز

استفاده از متغیرهای global در ECMAScript یک مثال ساده از کلوز است. به فکر زیرین این کد بیفتم:

var sMessage = "hello world";
function sayHelloWorld() {
  alert(sMessage);
}
sayHelloWorld();

در این کد، پس از بارگذاری اسکریپت به حافظه، مقدار متغیر sMessage برای تابع sayHelloWorld() محاسبه نشده است. این تابع تنها مقدار sMessage را برای استفاده در آینده ذخیره می‌کند، یعنی برنامه‌ریزر می‌داند که در زمان فراخوانی تابع sayHelloWorld() باید مقدار sMessage را بررسی کند. مقدار sMessage در زمان فراخوانی تابع sayHelloWorld() (در آخرین خط) تعریف می‌شود و پیام "hello world" را نمایش می‌دهد.

مثال پیچیده کلوز

تعریف یک تابع در یک تابع دیگر باعث پیچیده‌تر شدن کلوز می‌شود. به عنوان مثال:

var iBaseNum = 10;
function addNum(iNum1, iNum2) {
  function doAdd() {
    return iNum1 + iNum2 + iBaseNum;
  }
  return doAdd();
}

در اینجا، تابع addNum() شامل تابع doAdd() (کلوز) است. تابع داخلی یک کلوز است زیرا مقادیر پارامترهای تابع خارجی iNum1 و iNum2 و مقدار متغیر全局ی iBaseNum را دریافت می‌کند. مرحله آخر addNum() تابع doAdd() را فراخوانی می‌کند، دو پارامتر و متغیرهای global را به هم اضافه می‌کند و جمع آنها را بازمی‌گرداند.

نکته مهمی که باید بدانید این است که تابع doAdd() اصلاً پارامتر نمی‌پذیرد، بلکه مقادیر را از محیط اجرایی دریافت می‌کند.

می‌توان دید که کلوز یکی از بخش‌های قوی و کاربردی ECMAScript است که می‌تواند برای انجام محاسبات پیچیده استفاده شود.

توجه:مانند استفاده از هر تابع پیشرفته‌ای، باید از استفاده از کلوز به دقت استفاده کرد زیرا ممکن است بسیار پیچیده شوند.