Early error vs. error on first call to function vs. runtime error
Brendan Eich
brendan at mozilla.org
Fri Sep 28 09:24:09 PDT 2012
Oliver Hunt wrote:
> On Sep 27, 2012, at 10:54 PM, Brendan Eich<brendan at mozilla.org> wrote:
>
>> Oliver Hunt wrote:
>>> I'm generally against error on first call -- in the general case if you're able to determine a function should fail on first execution you can determine that it could fail during parsing and semantic analysis.
>> Ok, to play fair I should ask how you feel about any analysis that is not "cheap enough" to do during a parse or lex/read pass required to lazily compile functions on first call. What about binding analysis, recognizing every statically resolvable use of a definition, possibly making free variable uses early errors when inside module {...}?
>
> I am still not sure whether modules are expected to have a containing scope,
Yes, the global object and (we agreed last week) its lexical contour for
let/const/class/module bindings.
Note also that the design wants to allow modules to nest in top level
blocks, so outer blocks' let/const/function bindings could be in a
module's scope.
Then the solution (from the 1JS era early this year) for free variable
errors would make any properties of the global object already bound when
the modulel is parsed be bound in the module's scope. So you wouldn't
get a free variable error for 'alert', or the many other DOM bindings
and global scope pollutions.
> but either way noticing free var references during parsing in not a problem (why would it be?)
Because it requires use/def analysis, let's call it "definite binding
analysis". Just to parse JS, one need not do any such analysis.
> the reason I didn't say "all cases" is because resolution of an unbound global property obviously can't be determined during parsing, it also doesn't make sense to fail before the access (ignoring backwards compat issues entirely here the obviate this problem).
In a module {...} there wouldn't be any such backward compatibility problem.
It would make sense to fail early if the cause of the free variable not
matching anything in the global object at the time the module is parsed
is that you've typo'ed the name! This is quite common.
You're right it could break extant code that migrates into a module. One
can make a global by assignment in non-strict code, and this could be
hidden from any analysis.
There's a trade-off, but catching free variable typos seems important.
> I'm not sure what classes of error would warrant exception on initial execution vs. just failing on sema, could you give an example?
ES5 defines a number of normative early errors in Clause 16. We've just
been discussing duplicate formal parameters in a strict function's head,
e.g.
/be
More information about the es-discuss
mailing list