A bit confused by B.3.2 - Web Legacy Compatibility for Block-Level Function Declarations
Allen Wirfs-Brock
allen at wirfs-brock.com
Wed Jun 4 07:59:50 PDT 2014
On Jun 3, 2014, at 3:12 PM, John Lenz <concavelenz at gmail.com> wrote:
>
>
>
> On Mon, Jun 2, 2014 at 9:37 AM, Allen Wirfs-Brock <allen at wirfs-brock.com> wrote:
>
> On Jun 2, 2014, at 6:12 PM, John Lenz <concavelenz at gmail.com> wrote:
>
> >
> >
> > It seems to imply that existing "sloppy" code that does this is block scope:
> >
> > for (let x = 1; x < 1; x++) {
> > function f() {
> > }
> > store(f);
> > }
> >
>
> The above can't be “legacy code” as it contains a “let”. But, I’ll assume you meant to use a “var” in place of the “let”.
>
> No I intentionally used "let". This is not legacy code (I shouldn't have use the word "existing") but new "sloppy" mode code that would like the code to be block scoped. Does a "let", "const", or "class" declaration in scope force the function to be block scoped? That would be great but I think I am missing how this is specified in the spec as that would prevent most of the ambiguity. My main concern is code written with the intent to be block scoped but is not due to being run in sloppy mode.
OK, I see. No, the presence of “let” etc. doesn’t change anything. However, hopefully anybody using such new features will not depend upon anything other than pure block scoping and not write new code that depends upon the legacy compatibility semantics. Linters should flag code that depends upon the legacy semantics. Note that http://people.mozilla.org/~jorendorff/es6-draft.html#sec-web-legacy-compatibility-for-block-level-function-declarations says that ES implementations should log warnings when encountering such code.
Also, note that block scoping applies to all ES6 block level function declarations, in both strict and “sloppy” mode. The only difference is that in sloppy mode, in addition to the creation of the block level bindings of the function name, there is also a binding for the same name created (unless certain error conditions exist) at the top level of the function. That extra binding is only initialized (i.e., can be referenced without error) after a corresponding block level function declaration has been dynamically evaluated).
Code that uses uses block level functions and don’t depend upon the legacy semantics will produce the same results in either strict or sloppy mode.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20140604/169eb8aa/attachment.html>
More information about the es-discuss
mailing list