You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Lexical variable declarations (let, const) unusable in repl if error thrown during declaration/first assignment #8309
gives TypeError: Identifier 's' has already been declared.
I'm not sure whether this is a real bug or it's expected behaviour, but it sure does seem unusual that s becomes unusable from this point in in the repl.
This isn't a problem when running node on a js file because the TypeError simply terminates execution.
@polybuildr You can report it over at https://bugs.chromium.org/p/v8/issues/list. It looks spec compliant to me (the binding for s is never fully constructed and stays in the TDZ) but perhaps the error messages can be improved.
@bnoordhuis, @Slayer95, it does look spec-compliant, so I'm going to close this issue. However, that esdiscuss topic pointed me to something interesting that the Firefox Devtools console does and might be worth a shot.
For any such unresolved bindings (at least in the DevTools), Firefox steps in and turns them into undefined. So a redeclaration with let doesn't work, but simply s = 5 works from that point on. If anyone would like to consider doing this for the repl, feel free to reopen the issue.
> rangeArray = nj.arange(6,12)
ReferenceError: rangeArray is not defined
> rangeArray = new nj.arange(6,12)
ReferenceError: rangeArray is not defined
> var rangeArray = new nj.arange(6,12)
SyntaxError: Identifier 'rangeArray' has already been declared
> let rangeArray = new nj.arange(6,12)
SyntaxError: Identifier 'rangeArray' has already been declared
> let rangeArray = nj.arange(6,12)
SyntaxError: Identifier 'rangeArray' has already been declared
> var rangeArray = nj.arange(6,12)
SyntaxError: Identifier 'rangeArray' has already been declared
@ankit142 The issue as posted isn't about fixing the code in the example provided. There are many examples that could be provided.
Essentially this issue is that calling let x = <some_code_that_throws_an_error> leads to a situation where you cannot use x and you cannot redeclare let x. So for the remainder of the REPL session, the symbol x is unusable.
Again, the issue is not with "fixing the code". It is a bad behaviour of the REPL. You don't know that the code you just typed will hit an error. It does. The symbol you tried to use (x) is now unusable for the remainder of the REPL.
This isn't about "writing good code" vs. "writing bad code". This is about the user experience using the REPL when playing around with code.
Why would someone do this?
developer trying stuff -- copy/paste instructions from somewhere or whatever
Why not just use another symbol once x is unusable?
other code coming (think copy/paste instructions) leverages that same symbol; the user would be forced to either stop/restart the REPL or refactor the code they are about to paste
both of the workarounds above are not a good/healthy user experience
Reacted by Gabriel Poussif, Alan Johnson, Luiz Victor Linhares Rocha, Tira Odhner, Patrick Leiser and Graham Snyder
This issue has been marked as stale due to 210 days of inactivity.
It will be automatically closed in 30 days if no further activity occurs. If this is still relevant, please leave a comment or update it to keep it open.
Activity
vsemozhetbyt commentedon Aug 28, 2016
Different with
var:polybuildr commentedon Aug 28, 2016
Yep, works fine with
var.vkurchatkin commentedon Aug 28, 2016
Here is simplified test case:
addaleax commentedon Aug 28, 2016
This is very déjà-vu-ish to me, although I can’t find another issue for this bug… /cc @nodejs/v8?
polybuildr commentedon Aug 28, 2016
This error also occurs in the Chrome browser, so it's probably a v8 thing and not a Node thing. Sorry for reporting it in the wrong place.
polybuildr commentedon Aug 28, 2016
Where should I report this considering that it's not specific to node's repl?
Fishrock123 commentedon Aug 28, 2016
I wouldn't be surprised if this was how the spec worked.
In general, you'll have a better time using
varfor variables in the repl.bnoordhuis commentedon Aug 29, 2016
@polybuildr You can report it over at https://bugs.chromium.org/p/v8/issues/list. It looks spec compliant to me (the binding for
sis never fully constructed and stays in the TDZ) but perhaps the error messages can be improved.Slayer95 commentedon Aug 29, 2016
This is per spec: https://esdiscuss.org/topic/take-let-variable-out-of-temporal-dead-zone
polybuildr commentedon Aug 29, 2016
@bnoordhuis, @Slayer95, it does look spec-compliant, so I'm going to close this issue. However, that esdiscuss topic pointed me to something interesting that the Firefox Devtools console does and might be worth a shot.
For any such unresolved bindings (at least in the DevTools), Firefox steps in and turns them into undefined. So a redeclaration with
letdoesn't work, but simplys = 5works from that point on. If anyone would like to consider doing this for the repl, feel free to reopen the issue.MasterJames commentedon Jun 9, 2018
Not working all variations
gireeshpunathil commentedon Mar 16, 2020
re-opening, per #32288 (comment), #32288 (comment) and #32288 (comment)
14 remaining items
ankit142 commentedon Feb 15, 2024
gregfenton commentedon Feb 15, 2024
@ankit142 The issue as posted isn't about fixing the code in the example provided. There are many examples that could be provided.
Essentially this issue is that calling
let x = <some_code_that_throws_an_error>leads to a situation where you cannot usexand you cannot redeclarelet x. So for the remainder of the REPL session, the symbolxis unusable.ankit142 commentedon Feb 15, 2024
gregfenton commentedon Feb 15, 2024
Again, the issue is not with "fixing the code". It is a bad behaviour of the REPL. You don't know that the code you just typed will hit an error. It does. The symbol you tried to use (
x) is now unusable for the remainder of the REPL.This isn't about "writing good code" vs. "writing bad code". This is about the user experience using the REPL when playing around with code.
xis unusable?avivkeller commentedon Jun 5, 2024
FWIW @1Git2Clone has a issue with chromium at https://issues.chromium.org/issues/345248266.
eberestbacalso8-ui commentedon Dec 3, 2025
github-actions commentedon Jul 3, 2026
This issue has been marked as stale due to 210 days of inactivity.
It will be automatically closed in 30 days if no further activity occurs. If this is still relevant, please leave a comment or update it to keep it open.
repl: use inspector over vm