What would `if.value` look like in an example? Wouldn't it be possible to have something like `if(const x = getX() && const y = getY())` to capture more than just the conditional if required? I'm guessing that would probably break something somewhere, but I'm not sure what.
On Wed, 21 Mar 2018 at 04:35 Jordan Harband <[email protected]> wrote: > Is the use case only ever to capture the thing that serves as the > conditional? > > If so, would perhaps something like `if.value` work better? Since it's a > keyword, it could be made to only work in the `if` block, and you wouldn't > need any of that odd multi-statement stuff in the conditional parens. > > On Tue, Mar 20, 2018 at 12:57 PM, Rodrigo <[email protected]> wrote: > >> Proposal: inline let/const statements to declare and initialize >> variables within if statements, so that temporary variables exist only >> within the if/else block scope. >> >> Reason: limits variable scope to the block where really needed, in >> similar fashion to variables defined in for(;;) statements. This >> improves readability while reducing unnecessary variables roaming >> outside their needed block. >> >> The syntax would be very similar to the for(;;) assignment/test pair: >> >> if (let x = 100; x > 50) { >> console.log(x); // 100 >> } >> console.log(x); // ReferenceError >> >> // same for const >> if( const x = foo(); typeof x === 'object' ) { >> //... >> } >> >> // the variable is available within any else block >> // after its declaration >> if (let x = foo(); x < 50) { >> console.log(x); // y is not available here >> } else if (let y = bar(); y > 0) { >> console.log(x, y); >> } else { >> console.log(x, y); >> } >> >> Right now there isn't a way to limit a variable to the if block: >> >> let x = 100; >> if (x > 50) { >> console.log(x); >> } >> // x is in scope, but may not be needed beyond the if statement >> console.log(x); >> >> // or a non-strict assignment, which also "leaks" scope >> if( (x = 100) > 50 ) { >> // ... >> } >> >> There are many "workarounds" available, here's a few: >> >> // workaround 1: can be remedied with a scope block >> // but it's asymmetrical and non-idiomatic >> { >> let x = 100; >> if (x > 50) { >> console.log(x); >> } >> } >> >> // workaround 2: with a for statement >> // but this is non-idiomatic, hard to read and error-prone >> for (let x = 100; x > 50;) { >> console.log(x); >> break; >> } >> >> If-initialization is available in many languages (Go, Perl and Ruby >> come to mind) and are considered best practice in each one of them: >> >> // Golang - x is defined, assigned and conditionally tested >> if x := 100; x > 50 { >> // x is in scope here >> } else { >> // and in here >> } >> // x is not available here >> >> ###### Perl >> if( my $x = 100 ) { >> print $x; >> } >> print $x; # an error >> >> if ( ( my $x = myfoo() ) > 50 ) { # also ok in Perl >> print $x; >> } >> >> ###### Ruby >> if ( x = 100 ) # parens required per style guide >> puts(x) >> end >> puts(x) # unfortunately Ruby does not limit scope to if, so x "leaks" >> >> I think this would be a great and important addition to the language. >> >> -Rodrigo >> >> PS: Just for the sake of comparison, Perl-style if-assignments could also >> be an >> option, albeit a very bad one IMO: >> >> if( ( let x = 100 ) > 50 ) { >> } >> >> A Perl-style, value-returning let/const has readability issues, opens >> quite a few fronts and sort of implies that let/const can return >> values anywhere in the code outside if/else. On the other hand it >> would fit with the currently if assignment if( x = y ). Definitely not >> recommended. >> _______________________________________________ >> es-discuss mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/es-discuss >> > > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

