بسته‌ها

از ویکی‌کد، دانشنامهٔ برنامه‌نویسی
پرش به ناوبری پرش به جستجو

متغیرهای جاوا اسکریپت می‌توانند به ناحیه کد کلی (global) یا محلی (local) اشاره داشته باشند. [۱]

متغیرهای کلی می‌توانند با Closuer‌ها یا Scopeها به صورت خصوصی (private) تبدیل شوند.

متغیرهای کلی (Global)

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

مثال

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


مشاهدهٔ نتیجه


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

مثال

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


مشاهدهٔ نتیجه


در آخرین مثال متغیر a یک متغیر کلی است.

در یک صفحه وب، متغیرهای کلی به شیء پنجره اشاره دارند.

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

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

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

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

متغیرهایی که بدون یک کلمه کلیدی تعریف یعنی let, var یا const تعریف می‌شود، همیشه از نوع کلی هستند حتی اگر درون یک تابع تعریف شوند.

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

متغیرهای کلی تا زمانی که نرم‌افزار شما (پنجره شما / صفحه وب شما) باز است، زندگی می‌کنند.

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

یک شمارنده Dilemma

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

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

مثال

 1// Initiate counter
 2var counter = 0;
 3
 4// Function to increment counter
 5function add() {
 6  counter += 1;
 7}
 8
 9// Call add() 3 times
10add();
11add();
12add();
13
14// The counter should now be 3


مشاهدهٔ نتیجه


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

متغیر counter می‌بایست برای متغیر add() از نوع محلی (local) باشد تا از تغییر آن توسط سایر کدها جلوگیری کند:

مثال

 1// Initiate counter
 2var counter = 0;
 3
 4// Function to increment counter
 5function add() {
 6  var counter = 0;
 7  counter += 1;
 8}
 9
10// Call add() 3 times
11add();
12add();
13add();
14
15//The counter should now be 3. But it is 0


مشاهدهٔ نتیجه


این روش کار نمی‌کند زیرا که ما مقدار متغیر شمارنده یا counter کلی را به جای متغیر محلی counter نمایش می‌دهیم.

ما می‌توانیم متغیر counter کلی را پاک کنیم و به متغیر محلی counter با اجازه دادن به تابع برای برگرداندن مقدار آن دسترسی پیدا کنیم:

مثال

 1// Function to increment counter
 2function add() {
 3  var counter = 0;
 4  counter += 1;
 5  return counter;
 6}
 7
 8// Call add() 3 times
 9add();
10add();
11add();
12
13//The counter should now be 3. But it is 1.


مشاهدهٔ نتیجه


این روش نیز کار نمی‌کند زیرا که ما متغیر محلی (local) خود را در هر بار فراخوانی ریست می‌کنیم.

یک تابع داخلی جاوا اسکریپت می‌تواند این مشکل را رفع کند.

توابع Nested در جاوا اسکریپت

تمامی توابع به ناحیه کد کلی دسترسی دارند.

در حقیقت، در جاوا اسکریپت، تمامی توابع به ناحیه کد «بالای خود» دسترسی دارند.

جاوا اسکریپت از توابع nested پشتیبانی می‌کند. توابع nested به ناحیه کد «بالای خود» دسترسی دارند.

در مثال زیر، تابع داخلی plus() به متغیر counter در والد (parent) تابع دسترسی دارد:

مثال

1function add() {
2  var counter = 0;
3  function plus() {counter += 1;}
4  plus();
5  return counter;
6}


مشاهدهٔ نتیجه


این روش می‌تواند مشکل شمارنده dilemma را رفع کند اگر ما بتوانیم به تابع plus() از خارج از تابع دسترسی پیدا کنیم.

ما همچنین باید راهی پیدا کنیم که عبارت counter = 0 تنها یک بار اجرا شود.

ما به یک بسته نیاز داریم

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

مثال

 1var add = (function () {
 2  var counter = 0;
 3  return function () {counter += 1; return counter}
 4})();
 5
 6add();
 7add();
 8add();
 9
10// the counter is now 3


مشاهدهٔ نتیجه


توضیح مثال

متغیر add زمانی با مقدار بازگشتی از تابع خود اجرا مقدار دهی می‌شود.

متد خود اجرا تنها یک بار اجرا می‌گردد. این متد مقدار counter را صفر (۰) می‌کند و یک تابع تک عبارتی را برمی‌گرداند.

این روش یک تابع جدید اضافه می‌کند. قسمت «مهم و مفید» این جاست که این تابع می‌تواند به متغیر counter در ناحیه کد والد خود دسترسی داشته باشد.

به این امر در جاوا اسکریپت بسته (Closure) گفته می‌شود. این ابزار این امکان را به تابع می‌دهد که متغیرهای «خصوصی» داشته باشد.

متغیر counter توسط ناحیه کد تابع ناشناس (anonymous) محافظت می‌شود و فقط با استفاده از تابع add قابل تغییر است.

یک بسته (Closure) تابعی است که به ناحیه کد والد خود حتی بعد از اینکه تابع والد بسته شد، دسترسی دارد.

منابع آموزشی