On 4/7/2011 4:48 PM, P T Withington wrote:
On 2011-04-06, at 17:17, André Bargull wrote:
The special case for `typeof` is still necessary just as I've described in the
comments for visitUnaryExpression:
// Details: noteCallSite() may change the expression to =>
// `typeof ($lzsc$a.lineno = 42,<ID>)`
// If<ID> is not defined in the lexical environment, the comma expression
// throws a ReferenceError when it is evaluated. Therefore we can't allow
// noteCallSite() for identifiers here.
If<ID> is not defined in the lexical enviroment, `typeof<ID>` yields "undefined",
but `typeof ($lzsc$a.lineno = 42,<ID>)` would throw a ReferenceError because the comma expression is
evaluated before the `typeof` operator is applied.
Interesting.
I really thought that I invented the idea of being able to use `typeof` to check
for the existence of a binding (by implementing it that way in our swf< 9 code
generator, and using it to escape our undefined reference checker). I did not
realize that behavior was standardized. It's pretty obscurely documented in ES3,
made more clear by ES5.
The ES5 specification is definitely more readable than the ES3 one, even
simple things like algorithms were only barely understandable (slight
exaggeration here) in ES3.
I learn something from you every day!
Yeah! :D