2016-10-27 3 views
1

In JavaScript kann ich eine Variable mit var in einer if Anweisung, ohne Satzerklärung deklariert:Mit einem if-Anweisung mit einer let/const-Anweisung, ohne Blockanweisung

if (true) 
    var theAnswer = 42 

jedoch zu erklären versuchen, eine Variable let oder const ohne Block-Anweisung gibt einen Fehler:

if (true) 
 
    let theAnswer = 42

Chrome wirft SyntaxError: Unexpected identifier, Firefox- SyntaxError: lexical declaration not directly within block.

if (true) 
 
    const theAnswer = 42

Hier Chrome wirft SyntaxError: Unexpected token const, Firefox- SyntaxError: const declaration not directly within block.

Was ist der Grund dafür? Gibt es irgendetwas in der Spezifikation, das dieses Verhalten erklären könnte?

+0

Was wäre 'wenn (falsch) sei val = 4; console.log (val); 'drucken? Es wäre nie erklärt worden, also würde es immer eine Ausnahme werfen. – loganfsmyth

+1

@loganfsmyth Ich bin mir nicht sicher, was du sagen willst. Ich würde erwarten, dass dieser Code einen 'ReferenceError', nicht einen' SyntaxError' wirft. Jedoch 'If (falsch) var val = 4; console.log (val) 'wirft keine Fehler; stattdessen protokolliert es "undefiniert" (aufgrund des variablen Hebens). –

+1

@Gothdo gut, bedenken Sie es ein bisschen - 'wenn (cond) lassen Sie a = 1;' kann NIEMALS tun und ist im Grunde tot Code, warum sollten Sie einen ReferenceError? Der JS-Interpreter weiß bereits, dass es nutzlos ist und dass man damit buchstäblich nichts anfangen kann, daher finde ich es durchaus sinnvoll, einen Fehler zu bekommen. Solch eine Aussage kann schließlich nur falsch geschrieben werden. Sicher, Sie können andere Sprachkonstrukte haben, die keine Wirkung haben, aber diese spezifische ist 1. neu, so kann sie strenger durchgesetzt werden 2. trivial auf Gültigkeit zu überprüfen. – vlaz

Antwort

0

Es wäre eine Fuß-Pistole mit wenig zu gewinnen. var Initialisierung wird hochgezogen, so dass die Variable immer innerhalb der Funktion existiert und immer einen Wert hat. let und const sind innerhalb von Blöcken/Funktionen begrenzt und die Initialisierung wird nicht ausgelöst. Das bedeutet, dass, wenn der Fall, dass Sie durfte präsentieren, Code wie den folgenden werfen würde:

if (false) let foo = 4; 

console.log(foo); 

Da die let foo Linie nie ausgeführt wird, die foo Variable würde initialisiert nie werden. Das bedeutet, dass die foo Variable Zugriff auf immer eine „zeitliche tote Zone“ Fehler auslösen würde, wie

console.log(foo); 
let foo = 4; 

würde.

Wenn let ohne direkten Block/Funktions-Wrapper nicht zulässig ist, wäre let gefährlich und bietet minimalen Gewinn.

+0

Gibt es also einen besonderen Grund, den Fehler in Frage zu stellen?Es scheint, als gäbe es bereits genügend Regeln, um die Situation zu regulieren. – aw04

+0

@ aw04 Es ist völlig bedeutungslos Code _at best_ gefährlich und fehleranfällig in den meisten anderen Umständen. Gibt es einen besonderen Grund _nicht_ einen Fehler über eine Situation zu werfen, die entweder zurückkommt und dich beißt oder (wieder) _bei best_ bedeutet, dass du einen toten Code geschrieben hast? – vlaz

+0

Warum brauchen Sie einen besonderen Grund, um keinen Fehler zu verursachen? Ich war neugierig auf den besonderen Grund, warum der Fehler ausgelöst wird. Der Punkt ist, dass, wenn es nur einen Referenzfehler in der nächsten Zeile gab, dies wie erwartet erscheint. – aw04

Verwandte Themen