Declarations of var
variables get hoisted - the variable name initialization gets hoisted to the top of the containing function (or, if no function, to the top of the outer block). So
var withVar = (function() {throw 'error!'})()
is parsed by the interpreter as
var withVar;
withVar = (function() {throw 'error!'})()
The same is not true for let
- let
variables become initialized once the let __
line runs. When there's assignment, the right-hand side is parsed first; if the right-hand side throws an error, it never gets to the left-hand side, and the variable declared with let
never gets properly initialized; it'll stay in the demilitarized zone / temporal dead zone forever, so trying to reassign it throws an error.
It's kind of weird because the code is being run in the console - ordinarily, JS runs inside a <script>
tag, and if such an error occurs, usually no more code will run, and the fact that a variable declared with let
is no longer reassignable is the least of your worries.
The above was an issue in earlier Chrome versions. But in Chrome 80+, re-declarations of let
are now permitted, so the error
Uncaught SyntaxError: Identifier 'withLet' has already been declared
should no longer occur, regardless of whether the previous initialization of the variable succeeded or not:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…