Declarations in Conditionals S1
- Stage: Stage 1
- Status: Active
- ECMAScript edition: —
- Synchronized: Aug 28, 2026
- 中文译文 · Source repository
The proposal would allow variable declarations to appear directly in conditional statements such as if and while, combining declaration with a truthiness check. It suggests supporting let, const, using, and await using, while limiting the declared variable to the if block and requiring an additional expression after a semicolon for comma-separated lists or destructuring. This makes it possible to evaluate a value once, avoid repeating names, and reduce scope pollution.
The README below comes from the upstream repository and may contain outdated stage or status metadata. Use the proposal details above as the current source of truth.
Declarations in Conditionals
ECMAScript proposal for allowing variable declarations inside conditional statements (e.g. if/while).
Authors:
- Devin Rousso
Stage: 1
Candidate spec text is available.
Overview
When programming in C++, an extremely useful feature is to be able to declare a variable and have it be evaluated inside a conditional:
Adding this capability to JavaScript would be very useful for the following reasons:
- avoid having to retype the variable name
- finer-grain "control" over the visibility of the variable
- allow authors to write performance-"safe" code without having to know the specific details of the code being called (see example below)
In the case of JavaScript, however, there should be some limitations:
- only using
let,const,using, andawait using - only for
ifandwhile - only exposed in the
ifblock (i.e. not in theelse) - comma separated list, destructuring, etc. require a second expression after a
;to be provided in order to clarify what exactly is being tested
Examples
Here's an example of where allowing declarations in conditionals could be useful:
could be replaced by
which allows foo.data to only have to be evaluated once, and is much more stylistically succinct.
One could create another variable (e.g. let data = foo.data;), but that could potentially keep foo.data (via data) alive much longer than needed and would "pollute" the scope with an additional variable.
As another example, a non-module <script> needs an extra block to limit the scope of a temporary binding:
which becomes unnecessary if we can move the declaration to the condition:
Transpiler Support
This can be transpiled using blocks and a generated label:
Note that __if0 represents a fresh label chosen by the transpiler so it cannot conflict with any label in the source.