Allow arrow functions with conventional 'function' declarations
# Michael J. Ryan (8 years ago)
While I appreciate your sentiment, and often relied on housing myself. These days I'd be inclined to continue with the classic funny definition and hosting, or more likely to break it into a separate, testable module.
Not to be contain.
While I appreciate your sentiment, and often relied on housing myself.
These days I'd be inclined to continue with the classic funny definition
and hosting, or more likely to break it into a separate, testable module.
Not to be contain.
On Thu, Mar 29, 2018, 02:31 Michael Luder-Rosefield <rosyatrandom at gmail.com>
wrote:
> You're probably asking what on Earth the point of this is, and I'll tell
> you: _hoisting_.
>
> My preferred ES5 code style was always to declare functions after their
> use:
>
> ```
> doSomething1();
> doSomething2();
>
> function doSomething1 () {
> // ...
> }
>
> function doSomething2 () {
> // ...
> }
>
> It keeps things uncluttered and readable: you don't have to read through
> random functions before they are used, and have to work out what they're
> doing there.
>
> If you're able to make use of ES6 arrow functions declared with
> `const`/`let`, though, you would have to declare them before use. This
> obviously goes against my preferred style, and can also result in
> inconsistent placing of function declarations when mixed with conventional
> functions.
>
> My proposal is simple: after the initial `function name (params)`, allow
> the following forms:
> 1. { // body code }
> 2. => { // body code }
> 3. => // expression ;
>
> 1. is of course the current form
> 2. is similar, except it's a block body arrow function (all the usual
> arrow function differences apply; this binding, cannot be used with 'new',
> no 'arguments', no 'super'...)
> 3. allows for concise body arrow functions - semi-colon at end.
>
> Example:
>
> ```
> // with proposal
> doSomething1();
> doSomething2()
> .then(doSomething3);
>
> function doSomething1 () {
> // conventional function
> }
>
> function doSomething2 () => {
> // block body arrow function
> }
>
> function doSomething3 (value) => value ? foo(value) : bar();
>
> // without proposal
> const doSomething2 = () => {
> // block body arrow function
> };
> doSomething3 = value => value ? foo(value) : bar();
>
> doSomething1();
> doSomething2()
> .then(doSomething3);
>
> function doSomething1 () {
> // conventional function
> }
> ```
> As you can see, the latter code is just... messy and unpleasant.
>
> I don't think there's any potential issues in regards to interpreting
> syntax (it just requires a simple check for an arrow after the parameters),
> nor with readability. Async We would definitely need to clarify behaviour
> with `async` and generator functions, though.
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20180329/6a30a4b8/attachment.html>
You're probably asking what on Earth the point of this is, and I'll tell you: hoisting.
My preferred ES5 code style was always to declare functions after their use:
// with proposal doSomething1(); doSomething2() .then(doSomething3);
function doSomething1 () { // conventional function }
function doSomething2 () => { // block body arrow function }
function doSomething3 (value) => value ? foo(value) : bar();
// without proposal const doSomething2 = () => { // block body arrow function }; doSomething3 = value => value ? foo(value) : bar();
doSomething1(); doSomething2() .then(doSomething3);
function doSomething1 () { // conventional function }
You're probably asking what on Earth the point of this is, and I'll tell you: _hoisting_. My preferred ES5 code style was always to declare functions after their use: ``` doSomething1(); doSomething2(); function doSomething1 () { // ... } function doSomething2 () { // ... } It keeps things uncluttered and readable: you don't have to read through random functions before they are used, and have to work out what they're doing there. If you're able to make use of ES6 arrow functions declared with `const`/`let`, though, you would have to declare them before use. This obviously goes against my preferred style, and can also result in inconsistent placing of function declarations when mixed with conventional functions. My proposal is simple: after the initial `function name (params)`, allow the following forms: 1. { // body code } 2. => { // body code } 3. => // expression ; 1. is of course the current form 2. is similar, except it's a block body arrow function (all the usual arrow function differences apply; this binding, cannot be used with 'new', no 'arguments', no 'super'...) 3. allows for concise body arrow functions - semi-colon at end. Example: ``` // with proposal doSomething1(); doSomething2() .then(doSomething3); function doSomething1 () { // conventional function } function doSomething2 () => { // block body arrow function } function doSomething3 (value) => value ? foo(value) : bar(); // without proposal const doSomething2 = () => { // block body arrow function }; doSomething3 = value => value ? foo(value) : bar(); doSomething1(); doSomething2() .then(doSomething3); function doSomething1 () { // conventional function } ``` As you can see, the latter code is just... messy and unpleasant. I don't think there's any potential issues in regards to interpreting syntax (it just requires a simple check for an arrow after the parameters), nor with readability. Async We would definitely need to clarify behaviour with `async` and generator functions, though. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20180329/3f2be1b0/attachment-0001.html>