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:
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!
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.
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.
Tags und Links javascript const ecmascript-6 try-catch strict