کلمهٔ کلیدی Let

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


ECMAScript ۲۰۱۵[ویرایش | ویرایش]

نسخه ES2015 جاوا اسکریپت، شامل دو کلمهٔ کلیدی جدید بود: let و const. [۱]

این دو کلمهٔ کلیدی Scope یا ناحیه بلاک‌کد متغیرها (و ثابت‌ها) را در جاوا اسکریپت مشخص می‌کنند.

قبل از نسخه ES۲۰۱۵، جاوا اسکریپت تنها دو نوع ناحیه (Scope) برای بلاک‌های کد خود داشت: Global Scope (به فارسی: ناحیهٔ کد کلی) یا Function Scope (به فارسی: ناحیه کد تابع).

ناحیه کد کلی (Global Scope)[ویرایش | ویرایش]

متغیرهایی که به صورت کلی (بیرون از هر گونه تابعی) تعریف می‌شوند درون ناحیه کد یا Scope کلی یا Global قرار می‌گیرند.

مثال[ویرایش | ویرایش]

var carName = "Volvo";

// code here can use carName

function myFunction() {
  // code here can also use carName
}


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


متغیرهای کلی یا Global را می‌توان از هر جایی در یک برنامه جاوا اسکریپت، دسترسی داشت.

ناحیه کد تابع (Function Scope)[ویرایش | ویرایش]

متغیرهایی که به صورت محلی (Locally) (درون یک تابع) تعریف می‌شوند دارایLocally یا Function Scope هستند.

مثال[ویرایش | ویرایش]

// code here can NOT use carName

function myFunction() {
  var carName = "Volvo";
  // code here CAN use carName
}

// code here can NOT use carName


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


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

ناحیه بلاک کد (Block Scope) در جاوا اسکریپت[ویرایش | ویرایش]

متغیرهایی که به وسیلهٔ کلمهٔ var تعریف می‌شوند دارای ناحیه بلاک کد یا Block Scope نیستند.

متغیرهایی که درون یک بلاک {} قرار می‌گیرند از بیرون از بلاک کد قابل دسترسی هستند.

مثال[ویرایش | ویرایش]

{
  var x = 2;
}
// x CAN be used here

قبل از نسخه ES۲۰۱۵ جاوا اسکریپت ناحیهٔ بلاک یا Block Scope را نداشت.

متغیرهایی که با کلمهٔ کلیدی let تعریف می‌شوند می‌توانند دارای ناحیه بلاک یا Block Scope باشند.

متغیرهایی از این نوع که درون یک بلاک {} قرار می‌گیرند، از بیرون بلاک قابل دسترسی نیستند:

مثال[ویرایش | ویرایش]

{
  let x = 2;
}
// x can NOT be used here

از دوباره تعریف کردن متغیرها[ویرایش | ویرایش]

از دوباره تعریف کردن یک متغیر با استفاده از کلمهٔ کلیدی var می‌تواند موجب بروز مشکلات شود.

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

مثال[ویرایش | ویرایش]

var x = 10;
// Here x is 10
{
  var x = 2;
  // Here x is 2
}
// Here x is 2


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


از دوباره تعریف کردن یک متغیر با کلمهٔ کلیدی let می‌تواند این مشکل را رفع کند.

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

مثال[ویرایش | ویرایش]

var x = 10;
// Here x is 10
{
  let x = 2;
  // Here x is 2
}
// Here x is 10


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


سازگاری با مروگرها[ویرایش | ویرایش]

کلمهٔ کلیدی let به طور کامل در مرورگر اینترنت اکسپلور نسخه ۱۱ یا قدیمی‌تر پشتیبانی نمی‌شود.

جدول زیر، اولین نسخه‌های مرورگرهایی که به طور کامل از کلمهٔ کلیدی let پشتیبانی می‌کنند را لیست کرده‌است:

Chrome.gif Edge.gif Firefox.gif Safari.gif Opera.gif
Chrome 49 Edge12 Firefox 44 Safari 11 Opera 36
مارس ۲۰۱۶ ژوئیه ۲۰۱۵ ژانویه ۲۰۱۵ سپتامبر ۲۰۱۷ مارس ۲۰۱۶


ناحیه کد حلقه (Loop Scope):[ویرایش | ویرایش]

استفاده از کلمه var درون یک حلقه:

مثال[ویرایش | ویرایش]

var i = 5;
for (var i = 0; i < 10; i++) {
  // some statements
}
// Here i is 10


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


استفاده از کلمه let درون یک حلقه:

مثال[ویرایش | ویرایش]

let i = 5;
for (let i = 0; i < 10; i++) {
  // some statements
}
// Here i is 5


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

در مثال اول که با استفاده از کلمهٔ کلیدی var نوشته شده‌است، متغیری که درون حلقه تعریف شده‌است موجب از دوباره تعریف شدن متغیر بیرون حلقه با مقدار جدید می‌شود.

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

زمانی که کلمهٔ کلیدی let برای تعریف متغیر i در حلقه استفاده شده‌است، متغیر i تنها درون حلقه قابل مشاهده و دسترسی خواهد بود.

ناحیه کد تابع (Function Scope)[ویرایش | ویرایش]

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

هر دو آنها دارای ناحیه کد تابع یا Function Scope هستند:

function myFunction() {
  var carName = "Volvo";   // Function Scope
}
function myFunction() {
  let carName = "Volvo";   // Function Scope
}

ناحیه کد کلی (Global Scope)[ویرایش | ویرایش]

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

هر دو آنها دارای ناحیه کد کلی یا Global Scope هستند:

var x = 2;       // Global scope
let x = 2;       // Global scope

متغیرهای با ناحیه کد کلی در HTML[ویرایش | ویرایش]

با زبان جاوا اسکریپت، ناحیه کد کلی یا Global scope همان محیط جاوا اسکریپت است.

در HTML، ناحیه کد کلی یا Global scope شیء پنجره یا Window است.

متغیرهای کلی یا Global با کلمهٔ کلیدی var و مربوط به شیء پنجره یا Window تعریف می‌شوند:

مثال[ویرایش | ویرایش]

var carName = "Volvo";
// code here can use window.carName


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


متغیرهای کلی یا Global که با کلمهٔ کلیدی let تعریف می‌شوند به شیء پنجره یا window مربوط نیستند:

مثال[ویرایش | ویرایش]

let carName = "Volvo";
// code here can not use window.carName


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


از دوباره تعریف کردن[ویرایش | ویرایش]

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

مثال[ویرایش | ویرایش]

var x = 2;

// Now x is 2
 
var x = 3;

// Now x is 3


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


از دوباره تعریف کردن یک متغیر با کلمهٔ کلیدی var با یک متغیر با کلمهٔ کلیدی let در ناحیه کد مشترک یا Scope مشترک یا درون بلاک مشترک مجاز نیست:

مثال[ویرایش | ویرایش]

var x = 2;       // Allowed
let x = 3;       // Not allowed

{
  var x = 4;   // Allowed
  let x = 5   // Not allowed
}

از دوباره تعریف کردن یک متغیر با کلمهٔ کلیدی let با یک متغیر دیگر با کلمهٔ کلیدی let در ناحیه کد مشترک یا scope مشترک یا درون بلاک مشترک نیز، مجاز نیست:

مثال[ویرایش | ویرایش]

let x = 2;       // Allowed
let x = 3;       // Not allowed

{
  let x = 4;   // Allowed
  let x = 5;   // Not allowed
}

از دوباره تعریف کردن یک متغیر با کلمهٔ کلیدی let با یک متغیر دیگر با کلمهٔ کلیدی var ، در ناحیه کد مشترک یا Scope، یا درون بلاک مشترک نیز مجاز نیست:

مثال[ویرایش | ویرایش]

let x = 2;       // Allowed
var x = 3;       // Not allowed

{
  let x = 4;   // Allowed
  var x = 5;   // Not allowed
}

از دوباره تعریف کردن یک متغیر با کلمهٔ کلیدی let در ناحیه کد دیگر یا بلاک کد دیگر مجاز است:

مثال[ویرایش | ویرایش]

let x = 2;       // Allowed

{
  let x = 3;   // Allowed
}

{
  let x = 4;   // Allowed
}


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


بالا بردن (Hoisting)[ویرایش | ویرایش]

متغیرهایی که با کلمه var تعریف می‌شوند به بالای اسکریپت hoisted (به فارسی: منتقل)می‌شوند. (اگر شما نمی‌دانید که Hoisting چیست، فصل Hoisting یا جا به جایی را بخوانید )

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

مثال[ویرایش | ویرایش]

// you CAN use carName here
var carName;


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


متغیرهایی که با کلمهٔ کلیدی let تعریف می‌شوند به بالای اسکریپت جابه‌جا یا hosite نمی‌شوند.

استفاده از یک متغیر که با کلمهٔ کلیدی let تعریف شده قبل از تعریف آن، موجب پیغام خطای ReferenceError و یاخطای مرجع خواهد شد.

متغیر درون “موقعیت مرگ موقت” از بالای بلاک قرار دارد تا زمانی که تعریف شود:

مثال[ویرایش | ویرایش]

// you can NOT use carName here
let carName;

منابع آموزشی[ویرایش]