از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
تفاوت بین var، let و const در JavaScript و Best PracticesProgramming همیشه شامل تعریف داده، دستکاری داده ها و در نهایت نمایش داده ها بوده است. داده ها را می توان به صورت بیت هایی از اطلاعات نشان داد که می توانیم در برنامه های کامپیوتری آنها را تغییر دهیم. از آنجایی که مکانهای حافظه چندان قابل خواندن برای انسان نیستند و در طول زمان تغییر میکنند – ما شروع به حاشیهنویسی دادههای متغیر با دالهای قابل خواندن برای انسان کردهایم که…
سرفصلهای مطلب
معرفی
برنامه نویسی همیشه شامل تعریف داده، دستکاری داده ها و در نهایت نمایش داده ها بوده است. داده ها را می توان به صورت نمایش داد بیت ها اطلاعاتی که می توانیم در برنامه های کامپیوتری تغییر دهیم. از آنجایی که مکان های حافظه چندان قابل خواندن توسط انسان نیستند، و تغییر دادن در طول زمان – ما حاشیه نویسی را شروع کرده ایم متغیر داده ها، با دال های قابل خواندن برای انسان، که می توانیم آنها را بنامیم روی، به طور غیر مستقیم به داده های درون حافظه اشاره می کند.
این دال ها معمولا نامیده می شوند متغیرها یا متغیرهای مرجع.
متغیرها در اصل عبارتند از اشاره گرها یا منابع به برخی از داده ها در حافظه ماشین، و نشانگر را می توان به صورت پویا تغییر داد تا وضعیت واقعی داده هایی را که “برچسب گذاری کرده ایم” را منعکس کند.
توجه داشته باشید: معمولاً و عامیانه چنین گفته می شود “متغیرها داده ها را ذخیره می کنند” و اینکه آنها هستند “ظروف برای داده ها”. این از نظر فنی نادرست است و از یک مرز معنایی مبهم ناشی می شود – مشخص نیست که آیا افراد به آن اشاره می کنند یا خیر متغیرهای مرجع یا اشیاء در حافظه. (مرجع) متغیرها هستند اشاره گرها، و آنها نقطه به اشیاء در حافظه دستگاه – جایی که داده ها ذخیره می شوند. اصطلاحات محاوره ای به اندازه ای رایج هستند که می توانید آنها را در اسناد پیدا کنید، اما ارزش آن را دارد که تخصیص حافظه شیء را حداقل در پشت سر خود نگه دارید.
قبل از انتشار ES2015 (ES6)، متغیرهای جاوا اسکریپت فقط با استفاده از اعلان شدند var
کلمه کلیدی؛ با این حال، با معرفی ES6، راه های جدیدی برای اعلام متغیرها، let
و const
، معرفی شدند. این اغلب سوالاتی را مطرح می کند – عمدتاً در مورد اینکه کدام کلمه کلیدی باید استفاده شود و چه زمانی:
var english = "Hello there!";
let french = "Bonjour!";
const german = "Hallo!";
در این راهنما، تفاوت بین سه روش مختلف برای اعلام متغیرها در جاوا اسکریپت را بررسی خواهیم کرد –
var
،let
وconst
، دامنه آنها و زمان انتخاب کدام.
Scope در جاوا اسکریپت چیست؟
محدوده یک مفهوم مهم برای نوشتن کد در اکثر زبان های برنامه نویسی است و در انتخاب کلمه کلیدی متغیری که می خواهید استفاده کنید نقش مهمی ایفا می کند. محدوده تعریف می کند در دسترس بودن متغیر. در جاوا اسکریپت دو حوزه داریم: جهانی و محلی.
- دامنه جهانی: متغیرهای اعلام شده خارج از هر بلوک کد یا تابع به عنوان متغیرهای جهانی شناخته می شوند زیرا دارای a هستند دامنه جهانی، و می تواند از هر تابع یا بلوکی ارجاع داده شود.
توجه داشته باشید: در یک سند جاوا اسکریپت، فقط یک دامنه جهانی وجود دارد.
فرض کنید یک فایل اسکریپت دارید. مجدداً، هر متغیری که خارج از هر تابع یا بلوک اعلام شده باشد، به صورت سراسری دارای دامنه است:
// Initialized outside of function or block
var name = "John Doe";
function logName() {
console.log(name);
};
logName();
در مثال بالا، name
در داخل قابل دسترسی است logName()
عملکرد، زیرا دامنه جهانی دارد. در زمینه برنامه وجود دارد، و logName()
تابع می تواند تماس بگیرد روی آن زمینه!
- Local محدوده: متغیرهای اعلام شده در هر کدام بلوک کد یا تابع به عنوان متغیرهای محلی شناخته می شوند، زیرا دارای a هستند محدوده محلی. آنها را می توان فقط در بلوک های کد یا توابع ارجاع داد که در آن تعریف شده اند.
function logName() {
// Initialized within a function or block
var name = "John Doe";
var id = 1;
console.log(name);
};
function logId() {
console.log(id);
}
logId();
این منجر به:
error: Uncaught ReferenceError: id is not defined
چطور؟ id
تعریف شده است – اما در آن تعریف نشده است محدوده از logId()
تابع. تا آنجا که به عملکرد مربوط می شود – خیر id
وجود دارد. با بررسی اینکه آیا وجود دارد یا نه شروع می شود متغیر با محدوده محلی. از آنجایی که وجود ندارد، بررسی میکند که آیا A وجود دارد یا خیر متغیر با دامنه جهانی. اگر نه – id
از متن تعریف نشده است logId()
!
با پرایمر/یادآوری خارج از راه – بیایید نگاهی به چگونگی آن بیندازیم var
، let
و const
بستگی دارد روی دامنه، و زمانی که هر کدام باید استفاده شود!
این var کلمه کلیدی در جاوا اسکریپت
در جاوا اسکریپت، var
یک کلمه کلیدی رزرو شده است که با نام متغیر مرجع دنبال می شود. نامی که بعد از کلمه کلیدی تعریف می شود می تواند به عنوان نشانگر داده های درون حافظه استفاده شود.
استفاده کردن var
قدیمی ترین روش است اعلام متغیر در جاوا اسکریپت بیایید یک متغیر و را اعلام کنیم آن را اولیه کنید با اختصاص دادن یک مقدار به آن با استفاده از عملگر انتساب (=
):
// Declaration and initialization
var name = "John Doe";
از طرف دیگر، می توانید این را به دو مرحله تقسیم کنید – متغیر اعلام (آنچه هست) و متغیر مقداردهی اولیه (تخصیص یک مقدار به آن):
// Declaration
var name;
// Initialization
name = "John Doe";
توجه داشته باشید: در زبانهایی که به شدت تایپ میشوند، مانند جاوا، برای مدت طولانی، شما این را تعریف میکنید نوع از متغیر در طول اعلام، و در طول مقداردهی اولیه، شما فقط می توانید مقدار متناسب با آن نوع را اختصاص دهید. از آنجا که جاوا 10 – آ var
کلمه کلیدی اضافه شده است که نوع آگنوستیک است و نوع را در زمان اجرا استنباط می کند.
محدوده از var
وقتی در یک تابع تعریف می شود – هر var
محدود به آن تابع است. وقتی خارج از یک تابع تعریف شود، a var
جهانی است:
var firstName = "John";
function checkLastName() {
var lastName = "Doe";
}
در مثال قبل دو اعلان داریم: firstName
در سطح جهانی است زیرا خارج از یک تابع تعریف شده است، و lastName
به صورت محلی/تابع دارای محدوده است زیرا در یک تابع تعریف شده است:
var firstName = "John";
function checkLastName() {
var lastName = "Doe";
console.log(lastName); // "Doe"
console.log(firstName); // "John"
}
checkLastName();
console.log(lastName); // Uncaught ReferenceError: lastName is not defined
تا اینجای کار خیلی خوبه. با این حال – var
یک مسئله دارد
موضوع با var
var
بلوک اسکوپ نیست. هنگامی که یک متغیر را در یک بلوک کد، با استفاده از پرانتزهای فرفری ({}
)، دامنه آن از بلوک “بیرون می رود”! برای مثال:
var name = "John Doe";
var someBool = true;
if (someBool) {
var name = "Daniel Joan";
}
console.log(name);
این name
که اشاره به “جان دو” جهانی است، و name
که به “دانیل جوآن” اشاره می کند در یک بلوک تعریف شده است. با این حال، زمانی که ما سعی می کنیم آن را چاپ کنیم name
که در محدوده است، ما به این موارد برخورد می کنیم:
Daniel Joan
var
بلوک اسکوپ نیست. ما ممکن است فکر که ما یک محلی تعریف کرده ایمvar name
به “دانیل جوآن” اشاره کنیم، اما کاری که ما در واقعیت انجام داده ایم بازنویسی استvar name
که به “جان دو” اشاره می کند.
اعلان متغیرها با استفاده از var
اعلانها در همه جای کد شما میتوانند منجر به سردرگمی، بازنویسی متغیرهای جهانی موجود و بهطور پسوند – اشکالها شوند، درست همانطور که در قطعه کد دیدیم.
اینجاست که let
و const
لگد به داخل!
این اجازه دهید کلمه کلیدی در جاوا اسکریپت
این let
اعلان با ES6 معرفی شد و از آن زمان به روش ترجیحی برای اعلان متغیر تبدیل شده است. به عنوان یک پیشرفت در نظر گرفته می شود var
اعلامیه ها و است محدوده بلوکی (متغیرهایی که فقط در بلوک فوری قابل دسترسی هستند)، دور زدن مشکل اصلی که می تواند با استفاده از var
.
محدوده از اجازه دهید
متغیری که با let
کلمه کلیدی دارای دامنه محدود به بلوک یا تابعی است که در آن تعریف شده است:
let firstName = "John";
let lastName = "Doe";
let someBool = true;
if(someBool){
let firstName = "Jane";
console.log(firstName);
}
console.log(firstName);
این بار در اطراف – firstName
با اشاره به “جین” و firstName
با اشاره به “جان” همپوشانی نکنید! کد نتیجه می دهد:
Jane
John
این firstName
اعلام شده در داخل بلوک از نظر دامنه محدود به بلوک است و آنچه در خارج از بلوک اعلام شده است در سطح جهانی در دسترس است. هر دو نمونه از firstName
به عنوان مراجع متغیر متفاوت در نظر گرفته می شوند، زیرا دامنه های متفاوتی دارند.
این پایان کلمه کلیدی در جاوا اسکریپت
این const
اعلامیه همراه با ES6 معرفی شد let
، و بسیار شبیه به let
. const
همانطور که از نامش پیداست به داده هایی در حافظه اشاره می کند که مقادیر ثابتی دارند. const
متغیرهای مرجع را نمی توان دوباره به یک شی متفاوت در حافظه اختصاص داد:
const name = "John";
const name = "Jane";
این منجر به:
Uncaught SyntaxError: Identifier 'name' has already been declared
محدوده از پایان
محدوده یک متغیر تعریف شده با const
کلمه کلیدی، مانند محدوده let
اعلانات، محدود به بلوکی است که توسط مهاربندهای فرفری (یک تابع یا یک بلوک) تعریف شده است. تمایز اصلی این است که آنها را نمی توان به روز کرد یا دوباره اعلام کرد، به این معنی که مقدار در محدوده ثابت باقی می ماند:
const name = "John";
name = "Doe";
// Uncaught TypeError: Assignment to constant variable.
کنوانسیون های کدنویسی خوب
بنابراین، این همه به چه معناست، و کدامیک را باید انتخاب کنید، غیر از الزامات آشکار برای جلوگیری از اشکال؟ این در واقع می تواند به چند روش خوب خلاصه شود:
const
ترجیح داده می شودlet
، که ترجیح داده می شودvar
. از مصرف خودداری کنیدvar
.let
ترجیح داده می شودconst
زمانی که مشخص شود مقداری که به آن اشاره می کند در طول زمان تغییر می کند.const
برای مقادیر جهانی و ثابت عالی است.- کتابخانه ها معمولاً به صورت وارداتی انجام می شوند
const
.
هنگام وارد کردن یک کتابخانه و نمونه سازی آن – نمی خواهید بتوانید نمونه را دوباره به چیز دیگری اختصاص دهید، زیرا در یک شیب لغزنده از “استفاده از کتابخانه” وارد می شوید، در حالی که چیز دیگری در زیر “کد وارد می شود” است. هود.
به عنوان مثال، اگر قرار بود require()
یک کتابخانه مانند Axios، احتمالاً می خواهید از API آن استفاده کنید. با این حال، هیچ چیز مانع شما (یا شخص دیگری) نمی شود خاموش کردن axios
مثال با چیز دیگری اگر استفاده نکرده اید const
برای اعلام آن:
let axios = require('axios');
axios.get('some_url').then(someFunction());
axios = "Totally not a string!"
axios.get('some_url').then(someFunction()); // String has no method `get()`
با داشتن axios
بودن const
– از این موضوع اجتناب می شود. علاوه بر این، می توانید ثابت های جهانی را تعریف کنید که می توانند به عنوان ثابت های پیکربندی استفاده شوند:
const WIDTH = 1920;
const HEIGHT = 1080;
نتیجه
در این راهنما، پیشرفت اعلان متغیر در جاوا اسکریپت را از نسخه اصلی بررسی کرده ایم var
به جدیدتر let
و const
.
ما دامنهها را در جاوا اسکریپت بررسی کردهایم و اینکه چگونه دالهای اعلانهای مختلف بر دامنه یک متغیر در کد تأثیر میگذارند، به یک مشکل آشکار در استفاده از آن اشاره کردیم. var
. در نهایت، برخی از روشهای خوب را بررسی کردهایم، و یادآور میشویم که چه زمانی از کدام کلمه کلیدی استفاده کنیم.
منتشر شده در 1403-01-12 14:48:03