Is this sarcastic?
On 21 Mar 2018 12:58, "kai zhu" <[email protected]> wrote:
> this is why let and const should *never* have been introduced. if we had
> stuck with just var, none of these petty-arguments and bickering among
> team-members/shops on scoping-styles that ultimately have *zero*
> productivity or benefit to web-projects would be possible.
>
> and there's nothing wrong with pre-declaring all variables at the
> top-level of a function (which is an es5 best-practice that’s still valid
> today), regardless whether some are only used in conditional-blocks or not,
> like this real-world example [1]:
>
> ```
> local.validateBySwaggerSchema = function (options) {
> /*
> * this function will validate data against schema
> * http://json-schema.org/draft-04/json-schema-validation.
> html#rfc.section.5
> */
> var $ref,
> circularList,
> data,
> dataReadonlyRemove2,
> ii,
> oneOf,
> schema,
> test,
> tmp;
> ...
> // dereference schema.$ref
> $ref = schema && schema.$ref;
> if (!$ref) {
> break;
> }
> ...
> tmp = typeof data;
> if (tmp === 'object' && Array.isArray(data)) {
> tmp = 'array';
> }
> ...
> if (schema === local.swaggerSchemaJson.definitions.jsonReference) {
> ...
> }
> ...
> };
> ```
>
> [1] https://github.com/kaizhu256/node-swgg/blob/2018.2.1/lib.swgg.js#L4076
>
> -kai
>
> On Mar 21, 2018, at 7:15 PM, Jordan Harband <[email protected]> wrote:
>
> ```
> if (someComplicatedCondition()) {
> doSomeLogic();
> doSomeOtherLogic(if.value, true);
> }
> ```
>
> On Wed, Mar 21, 2018 at 2:52 AM, Rodrigo <[email protected]> wrote:
>
>> Here are my gripes with `let` and `const` returning values:
>>
>> 1) declaration lists are hard to read:
>>
>> if ((let x = 10, y = 20) > 15) {
>> // true, but what's being compared here? 10 or 20? (answer: 20)
>> }
>>
>> Although right now this is allowed and the last element is compared:
>>
>> if ((x = 10, y = 20) > 15) {
>> // result is true, 20 > 15
>> }
>>
>> 2) Destructuring assignments are also confusing, what's being compared
>> here?
>>
>> if(let [x,y] = [1,2]) {
>> }
>>
>> Again, this is allowed as of today:
>>
>> if([x,y] = [1,2]) {
>> // true, as it returns [1,2]
>> }
>>
>> 3) Nesting `let/const` would be either expected everywhere (not only
>> in the `if`) or a possible side effect from the implementation.
>> Similar to languages such as Perl.
>>
>> let x = foo(let y = 100, z = 200); // what's the scope of x and z?
>>
>> This leads to hard to read and very confusing code golf.
>>
>> That's why Golang went with something simple,
>> `if([declaration];[conditional])`, and avoided confusion over `:=`
>> assignments returning values anywhere in the code. `x:=( y:= 20 )` is
>> not allowed in Go.
>>
>> It expands on the 45-year tried-and-true structure of `for(;;)` to
>> create `if(;)` and keep the ES language simple and clear expanding on
>> its own concept of `for(;;)`.
>>
>> On Wed, Mar 21, 2018 at 7:57 AM, Naveen Chawla <[email protected]>
>> wrote:
>> > OK I neglected to read the original post fully. My last post example
>> would
>> > be based on allowing `const` and `let` declarations to expressions in of
>> > themselves (in the case of multi variables, returning the last one). So
>> let
>> > me ask, what exactly would be the problem with this?
>> >
>> > On Wed, 21 Mar 2018 at 12:20 Naveen Chawla <[email protected]>
>> wrote:
>> >>
>> >> 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
>>
>
> _______________________________________________
> 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