Block-level function declarations Web Legacy Compatibility bug
Allen Wirfs-Brock
allen at wirfs-brock.com
Sat Jul 18 02:34:56 UTC 2015
Good catches...
On Jul 17, 2015, at 5:12 PM, Kevin Gibbons wrote:
> In ECMAScript 2015, functions declared at the top level of function bodies and of scripts are var-like and functions declared in blocks are let-like (visible only in that block), generally speaking. This breaks some previously common patterns using block-level function declarations, which were not a part of ECMAScript 5 but were commonly supported in browsers, albeit with varying semantics. Thus, the ECMAScript 6 spec has an extension (annex B.3.3) which is intended to minimize this breakage by allowing function declarations in blocks to *also* be var-like when possible. This means that they create an additional binding in the containing function's scope which is assigned when execution reaches the block function declaration.
>
> However, B.3.3 looks for functions that permit these additional bindings among the containing function's VarScopedDeclarations, which essentially consists of top-level function declarations and any var declarations. Importantly, it does not include any function declarations inside of blocks, and so will never be applied.
>
> Unfortunately, the function body's LexicallyScopedDeclarations will also fail to contain function declarations inside of blocks. No existing static semantic rule will include the desired function declarations; changing the spec to accommodate this may require substantial additions beyond the scope of this email.
Right, see fix in https://bugs.ecmascript.org/show_bug.cgi?id=4427
>
> Also, I observe that these additional compatibility steps are only performed for function bodies, not scripts. I'm not sure if this is intentional, but it's a bit counterintuitive: `(function(){ { function f(){} } f(); })();` continues to work with no reference errors, but `{ function f(){} } f();` does not.
See fix in https://bugs.ecmascript.org/show_bug.cgi?id=4428
Allen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20150717/f88ce9f8/attachment.html>
More information about the es-discuss
mailing list