Oops, I did it again: debugging common mistakes in JavaScript

Oops, I did it again: debugging common mistakes in JavaScript

Shpesh, shkruajtja e kodit JavaScript është e vështirë dhe ndonjëherë madje frikësuese, një ndjesi e njohur për shumë programues. Gjatë procesit të punës, gabimet janë të pashmangshme dhe disa prej tyre ndodhin shpesh. Ky artikull, i dedikuar programuesve të rinj, diskuton këto gabime dhe mënyrat për t'i zgjidhur ato. Për qartësi, emrat e funksioneve, veçorive dhe objekteve janë marrë nga një këngë popullore. Të gjitha këto ndihmojnë në mbajtjen mend shpejt se si të rregullohen gabimet e zakonshme.

KujtojmĂ«: pĂ«r tĂ« gjithĂ« lexuesit e "Habra" — zbritje prej 10,000 rublej pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promocional "Habr".

Skillbox rekomandon: Kurs praktik «Programues i celularëve PRO».

TypeError: pronë e pa përcaktuar

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)

Shembulli i kodit tĂ« mĂ«sipĂ«rm jep gabimin Uncaught TypeError: Cannot read property ‘lucky’ of undefined. Problemi Ă«shtĂ« se objekti girl nuk ka atributin named, megjithĂ«se ka atributin name. Dhe pasi qĂ« atributi girl.named nuk Ă«shtĂ« i pĂ«rcaktuar, nuk Ă«shtĂ« e mundur tĂ« qasemi te ai, pasi formalisht ai nuk ekziston. Por nĂ«se e zĂ«vendĂ«soni girl.named.lucky me girl.name, atĂ«herĂ« gjithçka do tĂ« punojĂ« dhe programi do tĂ« kthejĂ« Lucky.

Më shumë rreth veçorive mund të lexoni këtu.

Mënyrat për të eliminuar gabimet TypeError

Gabimet TypeError ndodhin kur programuesi përpiqet të kryejë veprime me të dhëna që nuk përputhen me një tip të caktuar. Një shembull mund të jetë përdorimi i .bold(), kërkesa për atributin undefined ose thirrja e një funksioni që në të vërtetë nuk është një funksion.

Pra, nëse përpiqeni të thërrisni girl (), do të shfaqet gabimi Uncaught TypeError: yourVariable.bold is not a function dhe girl is not a function, pasi në të vërtetë po thirret objekti, jo funksioni.

PĂ«r tĂ« eliminuar gabimet, Ă«shtĂ« e nevojshme tĂ« studiohen variablat. Pra, çfarĂ« Ă«shtĂ« girl? Dhe çfarĂ« Ă«shtĂ« girl.named? TĂ« gjitha kĂ«to mund tĂ« kuptohen duke analizuar kodin, duke shfaqur variablat me komandĂ«n console.log me ndihmĂ«n e komandĂ«s debugger ose duke thirrur emrin e variablit nĂ« konsolĂ«. Duhet tĂ« siguroheni qĂ« keni mundĂ«sinĂ« tĂ« operoni me tipin e tĂ« dhĂ«nave qĂ« pĂ«rmban variabla. NĂ«se ai nuk pĂ«rshtatet, ndryshojeni, pĂ«r shembull, shtoni njĂ« kusht ose bllokun try..catch — dhe merrni kontroll mbi realizimin e operacionit.

Teprimi i stack-ut

Nëse besojmë autorët e fjalëve të këngës Baby One More Time (kjo është Britney Spears, po), fjala hit në këtë kontekst nënkupton dëshirën e këngëtares që të telefonojë përsëri (këtu është shpjegimi i kontekstit të këngës, - shënimi i përkthyesit). Mund të ndodhë që kjo dëshirë të çojë në një rritje të numrit të telefonatave në jetë reale. Por në programim, është një rekursivitet, një mënyrë për të shkaktuar një gabim në rast të mbipirjes së stack-ut të thirrjeve.

Gabimet duken si më poshtë:

Gabim: Hapësira e stack-ut është e mbushur (Edge)
GabimBrendshëm: shumë rekursivitet (Firefox)
GabimRange: Madhësia maksimale e thirrjes së stack-ut u kalua (Chrome)

Mbipirja e stack-ut ndodh nëse zhvilluesi nuk ka marrë parasysh rastin bazë në rekursivitet ose nëse kodi nuk i referohet rastit të parashikuar.

function oneMoreTime(stillBelieve=true, loneliness=0) {
    if (!stillBelieve && loneliness < 0) return
    loneliness++
    return oneMoreTime(stillBelieve, loneliness)
}

Në këtë rast, stillBelieve kurrë nuk mund të marrë vlerën false, prandaj çdo herë do të ndodhi thirrja oneMoreTime, por ekzekutimi i funksionit nuk do të përfundojë.

Nëse filloni të shpresoni për dy miq, kjo do të zvogëlojë loneliness (vetmi), dhe mund të mos presim një telefonatë.

function oneMoreTime(stillBelieve=true, loneliness=0) {
    if (!stillBelieve && loneliness < 0) return
    loneliness--
    stillBelieve = false
    return oneMoreTime(stillBelieve, loneliness)
}

Si një shembull mund të përmendim rastet me cikle të pafund, kur sistemi nuk lëshon një mesazh gabimi, por faqja ku ekzekutohet kodi JavaScript thjesht ngrin. Kjo ndodh nëse cikli while nuk ka një kusht për përfundimin.

let worldEnded = false
 
while (worldEnded !== true) {
  console.log("Keep on dancin' till the world ends")
}

Problemi mund të zgjidhet si më poshtë:

let worldEnded = false
 
while (worldEnded !== true) {
  console.log("Keep on dancin' till the world ends")
  worldEnded = true
}

Depurimi i cikleve të pafund dhe rekursivitetit

Nëse ndodh një problem me një cikël të pafund, në Chrome ose Edge duhet të mbyllni skedarin, dhe në Firefox - dritaren e shfletuesit. Pas kësaj, duhet të analizoni me kujdes kodin. Nëse nuk keni arritur të gjeni problemin, është mirë të shtoni komandën debugger në cikël ose funksion dhe të kontrolloni vlerat e variablave. Nëse rezultati nuk korrespondon me atë që prisni, atëherë e zëvendësoni, kjo mund të bëhet lehtësisht.

Në shembullin që u përmend më lart, debugger duhet të shtohet si rreshti i parë i funksionit ose ciklit. Pastaj duhet të hapni skedën e debugging në Chrome, duke analizuar variablat në scope. Me butonin next mund të ndjekim ndryshimin e tyre në çdo iteracion. Të bësh gjithçka këtë është e thjeshtë dhe në shumicën e rasteve problemi gjenet.

Më shumë informacion rreth kësaj mund të lexoni këtu (për Chrome) dhe këtu (për Firefox).

Gabim në sintaksë

Një nga gabimet më të zakonshme në JavaScript është SyntaxError. Të parandaloni ato mund të ndihmojnë shtesat e redaktorit të tekstit. Kështu, Bracket Pair Colorizer shënon kllapat në kod me ngjyra të ndryshme, ndërsa Prettier ose një mjet tjetër analize ofron mundësinë për të gjetur shpejt gabimet. Zgjedhja më e mirë, për të ulur mundësinë e shfaqjes së SyntaxError, është minimizimi i thellësisë.

Shpërndani në komentet: çfarë bëni për të shmangur gabimet ose për t'i zbuluar dhe hequr ato shpejt?

Skillbox rekomandon:

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster