JavaScript: Definieren Sie eine Konstante innerhalb von try / catch mit dem strikten Modus

8

Heute stoße ich auf einen seltsamen JS-Bug, der mit const in einem try / catch-Block arbeitet, und ich möchte besser verstehen, was ihn verursacht.

Sehen wir uns ein Codebeispiel an, das mehr als tausend Worte wert ist:

%Vor%

Dies wird protokollieren:

%Vor%

Wenn wir jedoch in den "strikten Modus" wechseln:

%Vor%

Nun erzeugt derselbe Code einen Fehler:

%Vor%

Wenn wir const mit var though ändern:

%Vor%

Dann funktioniert alles wieder gut, auch im "strikten Modus":

%Vor%

Kann mir bitte jemand helfen, zu verstehen, warum die const -Zuweisung nicht in einem try / catch-Block im "strikten Modus" funktioniert?

Danke!

    
Pensierinmusica 31.10.2015, 22:10
quelle

2 Antworten

15

const , wie in ECMAScript 6 definiert, ist eine Blocklevel-Variablendeklaration . Sie erhalten eine ReferenceError , weil sie nicht außerhalb von try liegt.

Allerdings wurde const in einigen Suchmaschinen lange vor ES6, als unveränderbares Gegenstück zu var , mit Scope-Verhalten auf Funktionsebene (und ohne TDZ). Wenn Sie sich im Sloppy-Modus befinden (was nicht sein sollte), können Sie dies dennoch als Teil der Legacy-Unterstützung Ihres Browsers erleben.

    
Bergi 31.10.2015, 22:19
quelle
4

Ihre JavaScript-Laufzeitumgebung wurde teilweise von ES6 const implementiert.

ReferenceError ist das erwartete Verhalten für Ihr erstes Beispiel, weil const Blockbereich ist und Sie greifen auf FOO außerhalb des definierenden try -Blocks zu.

Die von Ihnen verwendete Engine unterstützt die const -Syntax, wendet jedoch nur die Block-Scoping-Semantik im strikten Modus an.

Das aktuelle stabile Chrome (46) macht das. Chrome 48 wendet jedoch den Blockbereich mit oder ohne striktem Modus an.

var ist kein Blockbereich, daher funktioniert Ihr letztes Beispiel wie erwartet.

    
joews 31.10.2015 22:17
quelle