
Навиштани коди JavaScript метавонад душвор бошад ва баъзан комилан тарсонанда бошад, зеро бисёре аз таҳиягарон медонанд. Дар рафти процесс ногузир хатохо ба амал меоянд, ки баъзеи онхо такрор мешаванд. Ин мақола, ки барои оғози таҳиягарон нигаронида шудааст, ин хатогиҳо ва роҳҳои ҳалли онҳоро баррасӣ мекунад. Барои равшанӣ, номҳои функсияҳо, хосиятҳо ва объектҳо аз он гирифта шудаанд Ҳамаи ин ба шумо кӯмак мекунад, ки чӣ гуна хатогиҳои маъмулиро зуд ба ёд оред.
Мо ба шумо хотиррасон мекунем: барои ҳамаи хонандагони "Habr" - тахфифи 10 000 рубл ҳангоми номнавис шудан ба курсҳои Skillbox бо истифода аз рамзи таблиғотии "Habr".
Skillbox тавсия медиҳад: Курси амалӣ .
TypeError: амвол муайян карда нашудааст
let girl = {
name: "Lucky",
location: "Hollywood",
profession: "star",
thingsMissingInHerLife: true,
lovely: true,
cry: function() {
return "cry, cry, cries in her lonely heart"
}
}
console.log(girl.named.lucky)
Намунаи рамзи дар боло овардашуда хатогиро ба вуҷуд меорад "Ucaught TypeError: Хосияти "бахт" -и номуайян хонда намешавад." Масъала дар он аст, ки объекти "духтар" моликияти "ном" надорад, гарчанде ки он дорои "ном" аст. Ва азбаски амволи "girl.named" номуайян аст, ба он дастрасӣ пайдо кардан мумкин нест, зеро он аз ҷиҳати техникӣ вуҷуд надорад. Аммо, агар шумо "girl.namemed.lucky" - ро бо "духтар.ном" иваз кунед, ҳама чиз кор мекунад ва барнома "Бахти" -ро бармегардонад.
Тафсилоти бештарро дар бораи моликият пайдо кардан мумкин аст .
Чӣ тавр ислоҳ кардани хатогиҳои Type Errors
TypeErrors вақте рух медиҳад, ки барномасоз кӯшиш мекунад, ки амалеро оид ба маълумоте иҷро кунад, ки ба намуди муайян мувофиқат намекунад. Намунаҳо аз истифодаи .bold(), дархост барои моликияти номуайян ё даъват кардани функсияе, ки воқеан функсия нест, иборатанд.
Ҳамин тавр, агар шумо кӯшиш кунед, ки ба girl() занг занед, шумо хатогии Uncaught TypeError мегиред: yourVariable.bold функсия нест ва духтар функсия нест, зеро дар асл объект даъват карда мешавад, на функсия.
Барои бартараф кардани хатогиҳо, шумо бояд тағирёбандаҳоро тафтиш кунед. Пас, "духтар" чист? Ва "духтар ном" чист? Шумо метавонед тавассути таҳлили код, нишон додани тағирёбандаҳо бо истифода аз console.log, фармони debugger ё занги номи тағирёбанда дар консол пайдо кунед. Шумо бояд боварӣ ҳосил кунед, ки шумо метавонед навъи маълумотеро, ки тағирёбанда дар бар мегирад, идора кунед. Агар ин тавр набошад, онро тағир диҳед - масалан, бо илова кардани шарт ё блоки try..catch - ва назорати иҷрои амалиётро ба даст оред.
Зиёд шудани стек
Агар ба муаллифони таронаи "Baby One More Time" (яъне Бритни Спирс, duh) бовар кунем, вожаи "хит" дар ин замина ба хоҳиши дубора занг задани сароянда ишора мекунад (дар ин ҷо тавзеҳи матни тарона - ёддошти мутарҷим). Мумкин аст, ки ин хоҳиш дар ҳаёти воқеӣ боиси афзоиши зангҳо гардад. Аммо дар барномасозӣ ин рекурсия аст, ки метавонад дар сурати пур шудани стеки зангҳо ба хатогӣ оварда расонад.
Хатогиҳо чунин ба назар мерасанд:
Хатогӣ: фазои стек нест (Edge)
Хатои дохилӣ: рекурсияи аз ҳад зиёд (Firefox)
RangeError: Андозаи максималии стеки зангҳо зиёд шуд (Chrome)
Зиёдшавии стек вақте рух медиҳад, ки таҳиякунанда парвандаи асосиро дар рекурсия ҳисоб накунад ё вақте ки код парвандаи пешбинишударо ҳал намекунад.
function oneMoreTime(stillBelieve=true, loneliness=0) {
if (!stillBelieve && loneliness < 0) return
loneliness++
return oneMoreTime(stillBelieve, loneliness)
}
Дар ин ҳолат, stillBelieve ҳеҷ гоҳ ба бардурӯғ арзёбӣ карда наметавонад, бинобар ин ҳар дафъа oneMoreTime даъват карда мешавад, аммо функсия ҳеҷ гоҳ иҷроишро ба анҷом намерасонад.
Агар шумо ба ду дӯст такя карданро оғоз кунед, ин танҳоиро коҳиш медиҳад ва ба шумо лозим нест, ки зангро интизор шавед.
function oneMoreTime(stillBelieve=true, loneliness=0) {
if (!stillBelieve && loneliness < 0) return
loneliness--
stillBelieve = false
return oneMoreTime(stillBelieve, loneliness)
}
Мисол мисоли ҳалқаҳои беохир аст, ки дар он система паёми хатогиро намоиш намедиҳад, аммо саҳифае, ки рамзи JavaScript кор мекунад, танҳо ях мекунад. Ин вақте рух медиҳад, ки даври while шарти қатъкунӣ надошта бошад.
let worldEnded = false
while (worldEnded !== true) {
console.log("Keep on dancin' till the world ends")
}
Масъаларо ба таври зерин ҳал кардан мумкин аст:
let worldEnded = false
while (worldEnded !== true) {
console.log("Keep on dancin' till the world ends")
worldEnded = true
}
Ислоҳоти ҳалқаҳо ва рекурсияҳои беохир
Агар шумо бо мушкилоти ҳалқаи беохир дучор шавед, ҷадвалро дар Chrome ё Edge ё равзанаи браузер дар Firefox пӯшед. Пас аз он, кодро бодиққат таҳлил кунед. Агар шумо мушкилотро пайдо карда натавонед, ба ҳалқа ё функсия фармони ислоҳкунандаро илова кунед ва арзишҳои тағирёбандаро санҷед. Агар натиҷа он чизе, ки шумо интизор будед, набошад, онро иваз кунед - ин осон аст.
Дар мисоли боло, debugger бояд ҳамчун сатри аввали функсия ё давр илова карда шавад. Сипас, дар Chrome ҷадвали ислоҳро кушоед ва тағирёбандаҳоро дар миқёс таҳлил кунед. Бо истифода аз тугмаи навбатӣ, шумо метавонед тағироти онҳоро бо ҳар як такрор пайгирӣ кунед. Ин ҳама осон аст ва дар аксари мавридҳо мушкилот ба осонӣ муайян карда мешавад.
Шумо метавонед бештар дар бораи ин ҳама дар инҷо бихонед () ва дар ин ҷо ().
Хатогии синтаксис
Яке аз хатогиҳои маъмултарин дар JavaScript ин SyntaxError мебошад. Васеъкуниҳои муҳаррири матн метавонанд аз онҳо канорагирӣ кунанд. Масалан, Bracket Pair Colorizer қавсҳоро дар рамзи шумо бо рангҳои гуногун таъкид мекунад, дар ҳоле ки Prettier ё абзори таҳлилии шабеҳ ба шумо имкон медиҳад, ки хатогиҳоро зуд пайдо кунед. Беҳтарин роҳи кам кардани эҳтимолияти хатогиҳои SyntaxErrors кам кардани лона кардан аст.
Дар шарҳҳо мубодила кунед: шумо чӣ кор мекунед, то хатогиҳоро пешгирӣ кунед ё онҳоро зуд ошкор ва бартараф кунед?
Skillbox тавсия медиҳад:
- Курси дусолаи амалй .
- Курси онлайн .
- Курси солонаи амалӣ .
Манбаъ: will.com
