Ой, мен муну дагы бир жолу кылдым: JavaScript'те жалпы каталарды оңдоо

Ой, мен муну дагы бир жолу кылдым: JavaScript'те жалпы каталарды оңдоо

JavaScript кодун жазуу татаал жана кээде коркутуу болушу мүмкүн, анткени көптөгөн иштеп чыгуучулар жакшы билишет. Иштин жүрүшүндө сөзсүз түрдө каталар чыгып, айрымдары бат-баттан кайталанат. Жаңы иштеп чыгуучуларга багытталган бул макалада бул каталар жана аларды кантип чечүү керектиги айтылат. Түшүнүктүү болуу үчүн функциялардын, касиеттердин жана объекттердин аттары алынган популярдуу ыр. Мунун баары жалпы каталарды кантип оңдоону тез эстеп калууга жардам берет.

Биз эсиңизге салабыз: "Хабрдын" бардык окурмандары үчүн - "Habr" промо-кодун колдонуу менен каалаган Skillbox курсуна катталганда 10 000 рубль арзандатуу.

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)

Жогорудагы мисал код катаны ыргытат. Маселе кыз объектинин аталыш касиетине ээ болгонуна карабастан, аталган касиетке ээ эмес. Ал эми girl.namemed мүлкү аныкталбагандыктан, сиз ага кире албайсыз, анткени формалдуу түрдө ал жок. Ал эми girl.namemed.lucky дегенди girl.name менен алмаштырсаңыз, анда баары иштейт жана программа Lucky кайтып келет.

Сиз касиеттери жөнүндө көбүрөөк биле алабыз бул жерде окуганга.

TypeErrors кантип чечсе болот

TypeErrors программист белгилүү бир түргө дал келбеген маалыматтар боюнча аракеттерди жасоого аракет кылганда пайда болот. Мисалдарга .bold() колдонуу, аныкталбаган касиетти суроо же иш жүзүндө функция эмес функцияны чакыруу кирет.

Демек, кызга() чалууга аракет кылсаңыз, Uncaught TypeError катасын аласыз: yourVariable.bold бул функция эмес жана кыз функция эмес, анткени ал иш жүзүндө функция эмес, чакырылып жаткан объект.

Каталарды жок кылуу үчүн, өзгөрмөлөрдү изилдөө керек. Демек, кыз деген эмне? girl.name деген эмне? Кодду талдоо, console.log аркылуу өзгөрмөлөрдү көрсөтүү, мүчүлүштүктөрдү оңдоо буйругу же консолдогу өзгөрмө атын чакыруу аркылуу биле аласыз. Сиз өзгөрмө камтылган маалымат түрү боюнча иштөөгө мүмкүн экенине ынануу керек. Эгерде ал туура келбесе, аны өзгөртүңүз, мисалы, шартты кошуңуз же try..catch блогу - жана операциянын аткарылышын көзөмөлдөөнү колго алыңыз.

Stack overflow

Эгер сиз 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'то браузер терезесин жабуу керек. Андан кийин, сиз кылдаттык менен кодду талдоо керек. Эгер көйгөйдү таба албасаңыз, циклиңизге же функцияңызга мүчүлүштүктөрдү оңдоо буйругун кошуп, өзгөрмөлөрдүн маанилерин текшериңиз. Эгерде натыйжа күтүлгөнгө дал келбесе, анда биз аны алмаштырабыз, муну оңой эле жасоого болот.

Жогорудагы мисалда мүчүлүштүктөрдү оңдоочу функциянын же циклдин биринчи сабы катары кошулушу керек. Андан кийин, масштабдагы өзгөрмөлөрдү талдап, Chrome'до мүчүлүштүктөрдү оңдоо өтмөгүн ачышыңыз керек. Кийинки баскычты колдонуу менен ар бир кайталоодо алардын өзгөрүүлөрүнө көз салсаңыз болот. Мунун баарын жасоо оңой жана көпчүлүк учурда көйгөй табылат.

Мунун баары жөнүндө кененирээк бул жерден окуй аласыз (Chrome үчүн) жана бул жерде (Firefox үчүн).

Синтаксис катасы

JavaScriptдеги эң кеңири таралган каталардын бири - SyntaxError. Текст редакторунун кеңейтүүлөрү алардан качууга жардам берет. Мисалы, Bracket Pair Colorizer коддогу кашааларды түрдүү түстөр менен белгилейт, ал эми Prettier же ушуга окшош талдоо куралы каталарды тез табууга мүмкүндүк берет. SyntaxError ыктымалдыгын азайтуунун эң жакшы варианты - минималдуу уя салуу.

Комментарийлерде бөлүшүңүз: каталарды алдын алуу же аларды тез таап, жок кылуу үчүн эмне кыласыз?

Skillbox сунуштайт:

Source: www.habr.com

Комментарий кошуу