On Nov 11, 2011, at 10:50 AM, Erik Arvidsson wrote:

> We've all looked at jQuery code and envied the conciseness of its chaining 
> APIs. Most of us also looked at it and thought; Yuk, making everything a 
> method of jQuery and always return the jQuery object is ugly.

Beauty is in the eye of the beholder... jQuery made combinator libraries cool, 
and for that this functional programmer is permanently indebted to jresig.

But really, there's a world of difference between the chaining done by 
libraries like jQuery and the chaining you get from this operator. The former 
is pure, the latter is a mutation. The .{ syntax obscures this fact, and I find 
that inexcusable.

I'm not saying mutation is bad -- JS is no pure functional language, nor should 
it be. But creating an assignment operator that doesn't suggest syntactically 
that it's an assignment, and worse, advertising it as a "chaining operator" as 
if it were the same thing as what jQuery does, makes the same mistake of 
masking mutation that so many imperative programming languages make. Languages 
should be up front when they use mutation and not try to hide it or confuse 
programmers into not knowing when they're doing it.

Just for contrast, here's what your example might look like with a more 
explicit assignment syntax:

    document.querySelector('#my-element') .= {
        style .= {
            'color': 'red',
            'padding': '5px'
        },
        textContent: 'Hello'
    };

But that nested thingy smells awfully funny to me. This reminds me of excessive 
uses of "point-free style" in Haskell, where people do back-flips just to avoid 
creating variable names for intermediate results. Variables aren't evil! 
Sometimes it's just cleaner to use a local variable:

    let elt = document.querySelector('#my-element');
    elt.style .= {
        'color': 'red',
        'padding': '5px'
    };
    elt.textContent = 'Hello';

Worse, notice that you have provided *only* an ability to do deep mutation 
here, and no way to do a functional update (such as a copy with the specified 
changes, or a prototype extension with the changes) on nested structure. My 
spidey-sense was already tingling with monocle-mustache, but this nesting is 
another turn for the worse.

Dave

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to