تایپ خطا در مقابل خطای مرجع در جاوا اسکریپت – تفاوت چیست؟


به عنوان یک توسعه دهنده جاوا اسکریپت، احتمالاً هنگام کدنویسی با انواع مختلفی از خطاها مواجه شده اید. بیشتر اوقات اینها خطاهای نوع یا خطاهای مرجع هستند. اما آیا تا به حال فکر کرده اید که آنها چه معنایی دارند؟
آیا تا به حال سعی کرده اید قبل از حل این خطاها، نوع خطای تعیین شده توسط مترجم را بخوانید؟ اگر نه، باید، زیرا دانستن این خطاها می تواند به شما در حل مشکلات کمک کند.
به عنوان مثال، هنگامی که با یک خطا مواجه می شوید، احتمالاً آن را در گوگل جستجو می کنید. شما کل خطا را کپی و پیست می کنید و سعی می کنید با مراجعه به وب سایت ها و انجمن های مختلف راه حل را پیدا کنید. این یک روش آزمون و خطا برای یافتن و حل اشکالات است.
اما اگر از قبل می دانستید که چرا خطا به طور کلی رخ می دهد چه؟ این باعث صرفه جویی در وقت شما می شود که در غیر این صورت برای جستجوی راه حل های آنلاین صرف می کنید. درعوض، میتوانید به تنهایی با نگاه کردن به نوع خطا به دنبال راهحل باشید.
در این راهنما، با دو نوع خطا که بیشتر با آن مواجه می شوند آشنا خواهید شد که عبارتند از خطای نوع و خطای مرجع. شما خواهید آموخت که چرا آنها رخ می دهند، تفاوت بین آنها، و چگونه از گرفتن این خطاها جلوگیری کنید.
توجه: انواع دیگری از خطاها در جاوا اسکریپت مانند خطاهای نحوی، خطاهای داخلی، خطاهای محدوده و خطاهای eval وجود دارد. اما دامنه این مقاله به دو خطای رایج محدود می شود.
خطای نوع چیست؟
خطاهای نوع زمانی رخ می دهد که از چیزی استفاده می کنید که قرار نیست در آن روش خاص استفاده شود. به عنوان مثال، به جای استفاده از چکش، از پیچ گوشتی برای چکش زدن به میخ استفاده کنید.
بیایید این را با استفاده از یک مثال درک کنیم:
let a = 1 console.log(a()) //output Uncaught TypeError: a is not a function
در اینجا a
یک متغیر است که با یک مقدار مقدار دهی اولیه شده است. چون سعی کردید تابعی را با نام متغیر فراخوانی کنید با خطا مواجه شدید. یک متغیر را نمی توان به عنوان یک تابع فراخوانی کرد. توابع و متغیرها متفاوت عمل می کنند. پس در این مورد، شما یک خطای نوع دریافت می کنید. شما از متغیر let
متفاوت از نوع آن استفاده کردید.
راه حل: برای رفع این خطا، باید به متغیر موجود در کنسول، همانطور که برای استفاده در نظر گرفته شده است، مراجعه کنید. در این حالت به جای تابع، a
به عنوان متغیر ارسال می کنید.
let a = 1 console.log(a) //output 1
بیایید مثال دیگری بزنیم:
const a = 1 a = 2 // you reassign a const type variable again //output TypeError: Assignment to constant variable.
در اینجا، ما متغیر const
نوع a
به یک مقدار جدید اختصاص دادیم. اما شما نمی توانید متغیرهای const را به این صورت تغییر دهید، پس در این حالت با یک خطای نوع مواجه می شوید
راه حل: پس از تعریف متغیر نوع const
، هرگز آن را دوباره اختصاص ندهید.
const a = 1 const b = 2 console.log(a, b) //output 1 2
در اینجا مثال دیگری با استفاده از یک آرایه آورده شده است:
const myArray = [1,2,3,4] myArray = myArray.push(5) // reassign array //output TypeError: Assignment to constant variable.
در این مورد، نوع const
myArray
مجدداً اختصاص دادیم. این به ما یک خطای نوع می دهد زیرا باز هم، این نوع تخصیص مجدد برخلاف ویژگی های const
است.
راه حل:
const myArray = [1,2,3,4] myArray.push(5) // you can push new values //output [1,2,3,4,5]
شما به راحتی می توانید مقادیر جدید را بدون تخصیص مجدد آرایه به آن فشار دهید. این هیچ خطایی به شما نمی دهد. فشار دادن مقادیر به یک آرایه مجاز است. به این ترتیب می توانید از دریافت خطا جلوگیری کنید.
چگونه از دریافت خطای نوع جلوگیری کنیم
ساده ترین راه برای جلوگیری از خطاهای نوع، اجتناب از استفاده از نام های مشابه برای متغیرها و توابع مختلف است.
اگر از نامهای مختلف استفاده کنید، اشتباه نمیکنید و یکی را با دیگری جایگزین نمیکنید و به راحتی میتوانید از دریافت این خطا جلوگیری کنید.
راه دیگر این است که مطمئن شوید از متغیرها همانطور که قرار است استفاده شوند استفاده می کنید. به جای استفاده از const
زمانی که نیاز به تخصیص مجدد یک مقدار دارید، از let
(که اجازه این نوع تغییر را می دهد) استفاده کنید.
خطای مرجع چیست؟
خطاهای مرجع زمانی رخ می دهد که شما می خواهید به چیزی اشاره کنید یا از چیزی استفاده کنید که وجود ندارد. به عنوان مثال، به دنبال پیچ گوشتی در جعبه ابزار خود هستید، اما در آنجا نیست.
بیایید این را با استفاده از یک مثال درک کنیم:
let a = 1 console.log(b) // undefined variable used //output Uncaught ReferenceError: b is not defined
در اینجا، a
یک متغیر است که با یک مقدار مقداردهی اولیه شده است. ما با خطا مواجه شدیم زیرا سعی کردیم متغیر b
را که وجود ندارد را به صورت کنسولی وارد کنیم. ما هنوز چنین متغیری را اعلام نکرده بودیم، پس یک خطای مرجع در اینجا دریافت کردیم.
راه حل: فقط از متغیری که اعلام کرده اید استفاده کنید تا دچار خطا نشوید.
let a = 1 console.log(a) // used defined variable //output 1
این هم یک مثال دیگر:
if(true){ let a = 1 } console.log(a) //output ReferenceError: a is not defined
در این مثال، ما سعی می کنیم به a
از نوع let
در خارج از بلوک آن دسترسی داشته باشیم. مفسر نمی تواند آن را در خارج از بلوک پیدا کند. این به ما یک خطا می دهد.
راه حل:
if(true){ let a = 1 console.log(a) } //output 1
استفاده از متغیر در بلوک یا محدوده آن هیچ خطایی به شما نمی دهد.
بیایید یک مثال دیگر بزنیم، اما درک این یکی ممکن است دشوار باشد.
if(true){ console.log(a) let a = 1 } //output ReferenceError: Cannot access 'a' before initialization
a
هنوز در محدوده خود است. اما با خطا مواجه می شویم. چرا؟ زیرا ما سعی می کنیم قبل از تعریف متغیر از آن استفاده کنیم. این مجاز نیست و برخلاف ویژگی های متغیر let
است.
راه حل: از متغیر let
فقط پس از تعریف استفاده کنید.
if(true){ let a = 1 console.log(a) } //output 1
چگونه از دریافت خطای مرجع جلوگیری کنیم
ساده ترین راه برای جلوگیری از دریافت خطاهای مرجع مراجعه یا دسترسی به متغیرهای تعریف شده است. فقط از متغیرهای موجود استفاده کنید.
همچنین میتوانید از دستورات شرطی و مدیریت خطا برای جلوگیری از اجرای کد در صورت نبود متغیر یا تابع استفاده کنید.
نتیجه
زمانی که میدانید چگونه خطاهای خود را برطرف کنید، میتوانید به راحتی کد خود را اشکال زدایی کنید. خوب است خطاهای رایج و نحوه اجتناب از آنها را بدانید. این باعث صرفه جویی در وقت شما برای جستجوی راه حل های آنلاین و اتلاف ساعت ها در تلاش برای یافتن راه حل می شود، در صورتی که کمی دانش و آگاهی در مورد این موارد می تواند کمک کند.
ارسال نظر