Оҳ, ман инро бори дигар кардам: ислоҳи хатогиҳои умумӣ дар JavaScript

Оҳ, ман инро бори дигар кардам: ислоҳи хатогиҳои умумӣ дар JavaScript

Навиштани рамзи JavaScript метавонад душвор бошад ва баъзан комилан тарсонанда бошад, зеро бисёре аз таҳиягарон бо онҳо шиносанд. Дар рафти кор ногузир хатохо руй медиханд ва баъзеи онхо зуд-зуд такрор мешаванд. Ин мақола, ки ба таҳиягарони навкор нигаронида шудааст, дар бораи ин хатогиҳо ва роҳҳои ҳалли онҳо сӯҳбат мекунад. Барои равшанӣ, номҳои функсияҳо, хосиятҳо ва объектҳо аз он гирифта шудаанд суруди маъмул. Ҳамаи ин ба шумо кӯмак мекунад, ки чӣ гуна хатогиҳои маъмулиро зуд ба ёд оред.

Мо ба шумо хотиррасон мекунем: барои ҳамаи хонандагони "Habr" - тахфифи 10 000 рубл ҳангоми номнавис шудан ба курсҳои Skillbox бо истифода аз рамзи таблиғотии "Habr".

Skillbox тавсия медиҳад: Курси амалӣ "Таҳиягари мобилӣ PRO".

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)

Рамзи мисоли дар боло овардашуда хатои Uncaught TypeError-ро мепартояд: Хосияти "бахт" -и номуайян хонда намешавад. Мушкилот дар он аст, ки объекти духтар дорои моликияти номбаршуда нест, гарчанде ки он дорои номи ном аст. Ва азбаски амволи girl.named муайян нашудааст, шумо наметавонед ба он дастрасӣ пайдо кунед, зеро он расман вуҷуд надорад. Аммо агар шумо girl.named.lucky-ро бо girl.name иваз кунед, он гоҳ ҳама чиз кор мекунад ва барнома Lucky бармегардад.

Шумо метавонед дар бораи хосиятҳо бештар маълумот гиред ин ҷо бихонед.

Чӣ тавр ҳалли TypeErrors

TypeErrors вақте рух медиҳад, ки барномасоз кӯшиш мекунад, ки амалҳоро дар маълумоте иҷро кунад, ки ба намуди мушаххас мувофиқат намекунанд. Намунаҳо аз истифодаи .bold(), дархости моликияти номуайян ё даъват кардани функсияе, ки воқеан функсия нест, иборатанд.

Ҳамин тавр, агар шумо кӯшиш кунед, ки ба girl() занг занед, шумо хатогии Uncaught TypeError мегиред: yourVariable.bold функсия нест ва духтар функсия нест, зеро он воқеан объекти даъватшаванда аст, на функсия.

Барои бартараф кардани хатогиҳо, шумо бояд тағирёбандаҳоро омӯзед. Пас, духтар чист? girl.nomed чист? Шумо метавонед тавассути таҳлили код, нишон додани тағирёбандаҳо бо истифода аз console.log, фармони debugger ё даъват кардани номи тағирёбанда дар консол пайдо кунед. Шумо бояд боварӣ ҳосил кунед, ки дар намуди маълумоте, ки дар тағирёбанда мавҷуд аст, имконпазир аст. Агар он мувофиқ набошад, онро тағир диҳед, масалан, шартро илова кунед ё блоки try..catch - ва назорати иҷрои амалиётро ба даст оред.

Зиёдшавии стек

Агар шумо ба муаллифони матни суруди Baby One More Time бовар кунед (ин Бритни Спирс аст, ҳа), пас калимаи хит дар ин замина маънои хоҳиши овозхонро барои дубора даъват карданро дорад (дар ин ҷо шарҳи худи контексти суруд — ёддошти тарчумон). Мумкин аст, ки ин хоҳиш боиси зиёд шудани шумораи зангҳо дар ҳаёти воқеӣ гардад. Аммо дар барномасозӣ, ин як рекурсия аст, ки метавонад боиси хатогӣ гардад, агар стеки занг аз ҳад зиёд пур шавад.

Хатогиҳо чунин ба назар мерасанд:

Хатогӣ: фазои стек нест (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 кушоед ва тағирёбандаҳоро дар миқёс таҳлил кунед. Бо истифода аз тугмаи навбатӣ шумо метавонед тағироти онҳоро бо ҳар як такрор пайгирӣ кунед. Ҳамаи ин кор осон аст ва дар аксари ҳолатҳо мушкилот пайдо мешавад.

Шумо метавонед бештар дар бораи ин ҳама дар инҷо бихонед (барои хром) ва дар ин ҷо (барои Firefox).

Хатогии синтаксис

Яке аз хатогиҳои маъмултарин дар JavaScript ин SyntaxError мебошад. Васеъгардонии муҳаррири матн ба шумо кӯмак мекунад, ки аз онҳо канорагирӣ кунед. Масалан, Bracket Pair Colorizer қавсҳоро дар код бо рангҳои гуногун қайд мекунад ва Prettier ё абзори таҳлилии шабеҳ имкон медиҳад, ки хатогиҳо зуд пайдо шаванд. Беҳтарин вариант барои кам кардани эҳтимолияти хатогии SyntaxError лона кардани ҳадди аққал аст.

Дар шарҳҳо мубодила кунед: шумо барои пешгирӣ кардани хатогиҳо ё зуд ошкор ва бартараф кардани онҳо чӣ кор мекунед?

Skillbox тавсия медиҳад:

Манбаъ: will.com

Илова Эзоҳ