JavaScript-variabelen definiëren binnen if-statements

Is het definiëren van JavaScript-variabelen in if-statements correct?

if(a==1){
    var b = 1;
} else {
    var b = 0;
}

Ik weet dat de bovenstaande code zal werken, maar WebMatrix markeert de variabelen.

Moet ik de variabelen buiten de if-statement definiëren? Of is de eerste optie juist? Of maakt het eigenlijk niet uit?

var b = '';
if(a==1){
    b = 1;
} else {
    b = 0;
}

Antwoord 1, autoriteit 100%

Vanaf de officiële release van de ES2017-specificatie (2017-07-08), ondersteunt EcmaScript doenu echt blokbereik met behulp van de letof consttrefwoorden.


Aangezien ECMAscript geen blokbereikmaar functiebereikheeft, is het een goed idee om elke variabele bovenaan je functiecontexten te declareren.

Hoewel je kuntvariabelen en functiedeclaraties maken op elk punt binnen een functiecontext, is het erg verwarrend en levert het een aantal rare hoofdpijnen op als je je niet volledig bewust bent van de gevolgen.

Hoofdpijn voorbeeld:

var foo = 10;
function myfunc() {
    if (foo > 0) {
        var foo = 0;
        alert('foo was greater than 0');
    } else {
        alert('wut?');
    }
}

Raad eens, we krijgen een ‘wut?’ waarschuwing bij het bellen naar myfunchier. Dat komt omdat een ECMAscript-interpreter elke var-statement en functiedeclaratieautomatisch naar de bovenkant van de context zal hijsen. Kortom, foowordt geïnitialiseerd op undefinedvóór de eerste if statement.

Meer lezen: JavaScript-scoping en hijsen


Antwoord 2, autoriteit 6%

Houd er rekening mee dat ECMAscript 6 wel variabelen op blokniveau ondersteunt die het ‘let’-sleutelwoord gebruiken in plaats van het ‘var’-sleutelwoord. Terwijl variabelen die zijn gedeclareerd met ‘var’ worden gehesen om functiebereik te zijn, ongeacht waar ze zijn gedeclareerd, worden variabelen die zijn gedefinieerd met ‘let’ alleen beperkt tot het omsluitende blok.


Antwoord 3, autoriteit 3%

Het plaatsen van een var in een if-statement is niet tegen “de regels” van de taal, maar het betekent dat, vanwege het optillen van de var, die var wordt gedefinieerd ongeacht of aan de voorwaarde van het if-statement is voldaan.


Antwoord 4

Omdat JavaScript-variabelen een bereik op functieniveau hebben, is uw eerste voorbeeld in feite het opnieuw declareren van uw variabele, wat kan verklaren waarom deze wordt gemarkeerd.

In oude versies van Firefox werd de strikte JavaScript-modus gebruikt om te waarschuwen voor deze herverklaring, maar een van de ontwikkelaars klaagde dat het zijn stijl verkrampte, zodat de waarschuwing werd uitgeschakeld. (De huidige versies van Firefox ondersteunen een syntaxis voor variabele declaratie op blokniveau.)


Antwoord 5

Zie functie fourop Wat is de reikwijdte van variabelen in JavaScript?

Vanaf 2012 is er geen bereik op blokniveau in JavaScript. Dus je eerste versie is prima: de variabelen worden gedefinieerd in het bereik buiten het if-blok.

Other episodes