JavaScript Error Handling-Referencebror: ”x” is not defined
Next up on the list of articles in our JavaScript Error Handling series we take a closer at the Undefined Variable error. Määrittelemätön muuttujan virhe heitetään, kun viitataan muuttujaan tai objektiin koodilla, jota ei joko ole olemassa tai joka ei kuulu suorituskoodin soveltamisalaan.
alla käydään läpi pari yksittäistä esimerkkiä, jotka yleensä tuottavat määrittelemättömän muuttujan virheen, sekä miten tämä virhe saadaan kiinni ja käsitellään, kun se ilmestyy. Aloitetaan!
tekninen alasajo
- kaikki JavaScript-virheobjektit ovat Virheobjektin tai siinä olevan perityn objektin jälkeläisiä.
- ReferenceError-objekti periytyy Virheobjektista.
- määrittelemätön muuttujan virhe on tietyntyyppinen Referenssivirhe.
milloin sitä pitäisi käyttää?
kun syvällä prosessissa koodaus JavaScript, se ei ole kaikki, että ennenkuulumatonta tehdä kirjoitusvirhe tai yksinkertaisesti unohtaa alustaa muuttujan tai objektin ennen kuin soittaa mainitun muuttujan myöhemmin linjan. Tällöin JavaScript näyttää tyytymättömyytensä heittämällä määrittelemättömän muuttujan virheen, joka osoittaa, että viitattua kohdetta ei ole aiemmin määritelty.
esimerkiksi tässä tehdään yksinkertainen toteamus, että yritetään tarttua.pituus omaisuutta meidän määrittelemätön erivariable. Käytämme myös yksinkertaista try-catch-estoa ja nappaamme mahdolliset Viittausvirheet ja siirrämme ne sitten yksinkertaiselle printError-funktiolle kaunistamaan virheilmoitustemme ulostuloa:
var printError = function(error, explicit) { console.log(` ${error.name}: ${error.message}`);}try { // Calling an undefined `item `variable var length = item.length; console.log(`Length is ${length}.`)} catch (e) { if (e instanceof ReferenceError) { printError(e, true); } else { printError(e, false); }}
varmasti, odotetusti, JavaScript ilmoittaa, että kohde-muuttuja on määrittelemätön, ja tuottaa eksplisiittisen määrittelemättömän muuttujan virheen:
// FIREFOX ReferenceError: item is not defined// CHROME ReferenceError: item is not defined
on syytä huomata, että toisin kuin monet muut JavaScript-virheet olemme käsitelleet tässä sarjassa, määrittelemätön muuttuva virheviestiteksti ei eroa Firefoxin tai Chromen kahden moottorin välillä.
ilmeinen ja yksinkertainen korjaus tähän tiettyyn määrittelemättömään muuttujan virheeseen on yksinkertaisesti ilmoittaa kohteen muuttuja ennen sen kutsumista:
var printError = function(error, explicit) { console.log(` ${error.name}: ${error.message}`);}try { // Defining `item` first var item = "Bob"; var length = item.length; console.log(`Length is ${length}.`)} catch (e) { if (e instanceof ReferenceError) { printError(e, true); } else { printError(e, false); }}
nyt pääsemme kohteen ohi.pituus puhelu ilman heittää mitään virheitä ja siten tuottaa konsoli.loki tuotos pituus meidän kohde merkkijono:
Length is 3.
teknisesti määrittelemättömän muuttujan virheen tarkoituksena on tunnistaa viittaukset määrittelemättömiin muuttujiin, mutta sillä on merkitystä myös yritettäessä viitata muuttujiin, jotka on määritelty, mutta jotka eivät kuulu nykyiseen soveltamisalan kontekstiin, jossa koodia suoritetaan.
esimerkiksi tässä on yksinkertainen getFullName-funktio, joka määrittelee sisällään kaksi muuttujaa, etunimen ja sukunimen. Tämän funktion soveltamisalan ulkopuolella yritämme saada etunimimuuttujan pituuden ominaisuuden:
var getFullName = function() { var firstName = "Bob"; var lastName = "Smith"; return `${firstName} ${lastName}`;}var printError = function(error, explicit) { console.log(` ${error.name}: ${error.message}`);}try { // Accessing `firstName` from outside its scope var length = firstName.length; console.log(`Length is ${length}.`)} catch (e) { if (e instanceof ReferenceError) { printError(e, true); } else { printError(e, false); }}
vaikka etunimimuuttuja on teknisesti jo määritelty, se on meille saavuttamattomissa tällä suoritustasolla, ja näin syntyy määrittelemätön muuttujan virhe:
ReferenceError: firstName is not defined
tässä tapauksessa ratkaisussa on kyse etu-ja sukunimimuuttujan vetämisestä getfullnamefunktion ulkopuolelle, joten ne ovat samassa yhteydessä toteutuksesta try-catch-lohkonamme:
// 4// Declaring the variables outside our functionvar firstName = "Bob";var lastName = "Smith";var getFullName = function() { return `${firstName} ${lastName}`;}var printError = function(error, explicit) { console.log(` ${error.name}: ${error.message}`);}try { // Accessing `firstName` is now allowed var length = firstName.length; console.log(`Length is ${length}.`)} catch (e) { if (e instanceof ReferenceError) { printError(e, true); } else { printError(e, false); }}
odotetusti, virheitä ei synny ja saamme etunimimuuttujan pituuden tulosteena:
Length is 3.
sukeltaa vielä syvemmälle ymmärtämään, miten sovellukset käsittelevät JavaScript virheitä, tutustu vallankumouksellinen Airbrake JavaScript error tracking tool reaaliaikaisia hälytyksiä ja hetkellinen käsitys siitä, mikä meni pieleen JavaScript koodi.