بستن JavaScript

JavaScript متغیرها بهمحلییاجهانیمحدوده‌ها.

می‌توانند از طریقتغليقمحلی (خصوصی) را اجرا می‌کنند.

متغیرهای جهانی

توابع می‌توانند توابع را ببینندداخلیتوابع تعریف شده

مثال

function myFunction() {
    var a = 4;
    return a * a;
} 

آزمایش کنید

اما توابع می‌توانند توابع را نیز ببینندبیرونیمتغیرهایی که تعریف شده‌اند، مانند:

مثال

var a = 4;
function myFunction() {
    return a * a;
} 

آزمایش کنید

در این مثال آخر،a استجهانیمتغیر.

در وب‌سایت، متغیرهای جهانی به ویندوز متعلق هستند.

متغیرهای جهانی می‌توانند توسط همه اسکریپت‌های صفحه (و ویندوز) استفاده و تغییر شوند.

در مثال اول،a استمحلیمتغیر.

متغیرهای محلی فقط می‌توانند در داخل تابعی که در آن تعریف شده‌اند استفاده شوند. برای دیگر توابع و کدهای اسکریپت قابل دیدن نیستند.

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

باواژه‌کلیدی var متغیرهای ایجاد شده همیشه جهانی هستند، حتی اگر در داخل یک تابع ایجاد شوند.

زندگی متغیرها

متغیرهای جهانی به مدت زمان برنامه شما (ویندوز، وب‌سایت) زندگی می‌کنند.

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

یک بحران شمارنده

فرض کنید می‌خواهید از متغیر برای شمارش استفاده کنید و می‌خواهید این شمارنده برای همه توابع قابل استفاده باشد.

می‌توانید از متغیر جهانی و توابع برای افزایش شمارنده استفاده کنید:

مثال

// شمارنده را تنظیم می‌کنیم
var counter = 0;
// توابعی که شمارنده را افزایش می‌دهند
function add() {
  counter += 1;
}
// سه بار add() فراخوانی شود
add();
add();
add();
// در اینجا شمارنده باید 3 باشد

آزمایش کنید

این راه‌حل یک مشکل دارد: هر کد روی صفحه می‌تواند شمارنده را تغییر دهد بدون اینکه add() فراخوانی شود.

برای تابع add()، شمارنده باید محلی باشد تا از تغییرات دیگر کد جلوگیری شود:

مثال

// شمارنده را تنظیم می‌کنیم
var counter = 0;
// توابعی که شمارنده را افزایش می‌دهند
function add() {
  var counter = 0; 
  counter += 1;
}
// سه بار add() فراخوانی شود
add();
add();
add();
// در اینجا شمارنده باید 3 باشد. اما 0 است.

آزمایش کنید

این بی‌فایده است زیرا ما شمارنده جهانی را به جای شمارنده محلی نمایش می‌دهیم.

با اینکه توابع را به خود برگردانیم، می‌توانیم شمارنده جهانی را حذف کنیم و به شمارنده محلی دسترسی پیدا کنیم:

مثال

// توابعی که شمارنده را افزایش می‌دهند
function add() {
  var counter = 0; 
  counter += 1;
  return counter;
}
// سه بار add() فراخوانی شود
add();
add();
add();
// در اینجا شمارنده باید 3 باشد. اما 1 است.

آزمایش کنید

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

توابع داخلی JavaScript می‌توانند این مشکل را حل کنند.

توابع عمیق JavaScript

همه توابع حق دسترسی به محدوده‌های جهانی را دارند.

در واقع، در JavaScript، همه توابع حق دسترسی به محدوده‌های بالاتر خود را دارند.

JavaScript از توابع عمیق پشتیبانی می‌کند. توابع عمیق می‌توانند به محدوده‌های بالاتر دسترسی داشته باشند.

در این مثال، توابع داخلی plus() می‌توان به متغیرهای پدر تابع دسترسی داشت counter شمارنده متغیر:

مثال

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();     
    return counter; 
}

آزمایش کنید

اینطور است که می‌توانیم از بحران شمارنده جلوگیری کنیم، اگر بتوانیم به آن از بیرون دسترسی پیدا کنیم plus() توابع.

ما همچنین نیاز داریم که یک counter = 0 روش.

ما به تغليق (closure) نیاز داریم.

بستن JavaScript

آیا فانکشن‌های خودکار را به خاطر دارید؟ این فانکشن‌ها چه کاری انجام می‌دهند؟

مثال

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
add();
add();
add();
// شمارنده در حال حاضر 3 است 

آزمایش کنید

توضیح مثال

متغیر add تخصیص

این فانکشن خودکار فقط یک بار اجرا می‌شود. شمارنده را به صفر (0) تنظیم می‌کند و توابع معادله را برمی‌گرداند.

اینطور که می‌بینید، add به عنوان یک توابع در آمده است. "بخش‌های برجسته‌ترین" این است که می‌تواند به شمارنده در محدوده‌ی پدر دسترسی داشته باشد.

این به عنوان JavaScript شناخته می‌شود تغليق. این باعث می‌شود که توابع دارایخصوصیممکن است.

شمارنده توسط محدوده‌ی این فانکشن ناشناس محافظت می‌شود و فقط می‌توان از طریق Function add آن را تغییر داد.

تغليق (closure) به معنای توابعی است که امکان دسترسی به محدوده‌ی پدر را دارند، حتی پس از بسته شدن آن.