از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
رفع “ReferenceError: نمی توان قبل از مقداردهی اولیه دسترسی پیدا کرد” در جاوا اسکریپت
سرفصلهای مطلب
معرفی
جاوا اسکریپت که یک زبان پویا و با تایپ ضعیف است، مجموعه ای از چالش ها و خطاهای منحصر به فرد خود را دارد. یکی از این خطاها که اغلب توسعه دهندگان را گیج می کند، خطا است ReferenceError: Cannot access 'variable' before initialization
.
در این بایت، رمز و راز این خطا را کشف خواهیم کرد، متوجه می شویم که چرا مقداردهی اولیه متغیرها بسیار مهم است، و رفتار آن را با هم مقایسه می کنیم. var
، let
، و const
.
ReferenceError چیست؟
را ReferenceError: Cannot access 'variable' before initialization
زمانی پرتاب می شود که سعی می کنید به یک متغیر قبل از مقداردهی اولیه دسترسی پیدا کنید. در جاوا اسکریپت، میتوانید یک متغیر را بدون مقداردهی اولیه آن اعلام کنید، اما اگر قبل از اینکه مقداری به آن اختصاص داده شود، سعی کنید از آن استفاده کنید، با این خطا مواجه خواهید شد.
let testVar;
console.log(testVar); // undefined
console.log(notInitializedVar); // ReferenceError: Cannot access 'notInitializedVar' before initialization
let notInitializedVar;
در مثال بالا، testVar
اعلام شده است اما مقداردهی اولیه نشده است، بنابراین زمانی که آن را به سیستم وارد می کنیم console، برمی گردد undefined
. با این حال، notInitializedVar
قبل از اینکه اعلام شود در دسترس است و در نتیجه a ReferenceError
.
چرا متغیرهای خود را مقداردهی اولیه کنید؟
مقداردهی اولیه متغیرها به دلایل مختلفی در جاوا اسکریپت عمل خوبی است. اول اینکه کد شما را قابل پیش بینی تر می کند. هنگامی که یک متغیر مقدار دهی اولیه می شود، دقیقاً می دانید که مقدار آن در شروع برنامه چقدر است. این می تواند از اشکالات جلوگیری کند و درک کد شما را آسان تر کند.
دوم، مقداردهی اولیه متغیرها می تواند عملکرد را بهبود بخشد. موتورهای جاوا اسکریپت زمانی می توانند کد شما را بهتر بهینه کنند که انواع متغیرهای شما را از قبل بدانند.
سوم، این یک الزام در هنگام استفاده است const
. اگر متغیری را با const
و آن را مقدار دهی اولیه نکنید، a دریافت خواهید کرد SyntaxError
.
let testVar; // OK
const testConst; // SyntaxError: Missing initializer in const declaration
انواع مختلف متغیرها
در جاوا اسکریپت می توانید متغیرها را با استفاده از آن اعلام کنید var
، let
، یا const
. تفاوت بین آنها در محدوده و رفتار بالابر آنها نهفته است.
var
دارای محدوده تابع است و با مقدار اولیه به بالای محدوده خود بالا می رود undefined
. این بدان معنی است که شما می توانید قبل از اعلام آن به آن دسترسی داشته باشید، اما باز خواهد گشت undefined
.
console.log(testVar); // undefined
var testVar = 'Hello, World!';
let
و const
بلوک اسکوپ هستند و همچنین تا بالای محدوده خود بالا می روند. با این حال، آنها از ابتدای بلوک تا زمان رسیدگی به اظهارنامه آنها در یک “منطقه مرده موقت” باقی می مانند. در این مدت دسترسی به آنها منجر به الف ReferenceError
.
console.log(testLet); // ReferenceError: Cannot access 'testLet' before initialization
let testLet = 'Hello, World!';
console.log(testConst); // ReferenceError: Cannot access 'testConst' before initialization
const testConst = 'Hello, World!';
سایه زدن
در جاوا اسکریپت، اعلان های متغیر می توانند سراسری یا محلی باشند. متغیرهای سراسری خارج از یک تابع اعلان می شوند، در حالی که متغیرهای محلی در داخل یک تابع اعلان می شوند. این تمایز مهم است زیرا محدوده متغیر را تعیین می کند – یعنی جایی که می توان به آن دسترسی داشت.
زمانی گفته میشود که متغیری در سایه قرار میگیرد که یک متغیر محلی همنام یک متغیر سراسری باشد. این می تواند منجر به رفتار غیرمنتظره شود، زیرا متغیر محلی بر متغیر جهانی اولویت دارد.
به مثال زیر توجه کنید:
let x = 10; // global variable
function foo() {
let x = 20; // local variable
console.log(x); // outputs 20
}
foo();
console.log(x); // outputs 10
در این مثال، متغیر محلی x
داخل تابع foo
متغیر سراسری را سایه می اندازد x
. داخل foo
، ارزش x
20 هست ولی بیرون foo
، ارزش x
10 است.
توجه داشته باشید: سایه های متغیر می تواند منجر به سردرگمی و اشکالات در کد شما شود. بهتر است از استفاده از یک نام برای متغیرهای محلی و سراسری خودداری کنید.
بالا بردن
Hoisting یک مکانیسم جاوا اسکریپت است که در آن متغیرها و اعلانهای تابع در مرحله کامپایل به بالای محدوده حاوی خود منتقل میشوند. این بدان معناست که شما می توانید از یک متغیر استفاده کنید یا یک تابع را قبل از اعلام آن فراخوانی کنید.
بیایید به یک مثال نگاه کنیم:
console.log(x); // outputs undefined
var x = 5;
console.log(x); // outputs 5
بااینکه x
بعد از اول اعلام می شود console.log
، کد a نمی اندازد ReferenceError
. این به این دلیل است که جاوا اسکریپت اعلان x
به بالای دامنه.
با این حال، توجه به این نکته مهم است که فقط اعلامیه ها بالا می روند. مقداردهی اولیه (زمانی که مقداری را به متغیر اختصاص می دهید) بالا نمی رود. به همین دلیل است که اولین console.log
خروجی ها undefined
بجای 5
.
توجه داشته باشید: در حالی که بالا بردن می تواند مفید باشد، می تواند منجر به رفتار غیرمنتظره نیز شود. به طور کلی تمرین خوبی است که متغیرهای خود را در بالای دامنه اعلام و مقداردهی کنید تا از سردرگمی جلوگیری شود.
بهترین شیوه ها
هنگام نوشتن جاوا اسکریپت، مهم است که متغیرهای خود را در کجا قرار دهید. در اینجا چند بهترین روش وجود دارد که باید به خاطر داشته باشید:
-
متغیرها را در بالای دامنه اعلام کنید: این می تواند به جلوگیری از مشکلات مربوط به بالا بردن کمک کند و کد شما را برای خواندن و درک آسان تر کند.
-
استفاده کنید
let
وconst
بجایvar
:let
وconst
دارای محدوده بلوک هستند، به این معنی که آنها فقط در بلوکی که در آن اعلام شده است قابل دسترسی هستند. این می تواند به جلوگیری از مشکلات مربوط به سایه متغیر کمک کند.var
روش اصلی برای اعلام متغیرها در JS بود، اما اکنون بهترین روش استفاده از آن استlet
یاconst
. -
هنگامی که متغیرها را اعلام می کنید، مقداردهی اولیه کنید: این می تواند به پیشگیری کمک کند
ReferenceError: Cannot access before initialization
خطاها
در اینجا یک مثال است که از این بهترین شیوه ها پیروی می کند:
function foo() {
let x = 10; // declare and initialize at the top of the scope
const y = 20; // use const for variables that won't change
// rest of the code...
}
// rest of the code...
نتیجه
به عنوان یک توسعه دهنده JS، برای جلوگیری از خطاهایی مانند ReferenceError: Cannot access before initialization
. JS کمی متفاوت از زبان های دیگر کار می کند، بنابراین این تفاوت های ظریف می تواند گیج کننده باشد. با پیروی از بهترین روشها مانند اعلام متغیرها در بالای دامنه، با استفاده از let
و const
بجای var
و زمانی که متغیرها را تعریف می کنید، مقداردهی اولیه کنید، می توانید کد تمیزتر و قابل پیش بینی تری بنویسید.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1402-12-31 10:19:04