A fun little spec deviation in the major JS engines

Jeff Walden jwalden+es at MIT.EDU
Sat Jan 28 19:13:57 PST 2012

At least, if you consider |with| and |eval| fun (and who doesn't?):

   js> var x = "outer"; function f() { with({ x: 17 }) eval("var x"); return x; } typeof f()

This seems to be the behavior in every engine out there.  But according to the last ES5 errata for 10.5, and in the latest ES6 draft, since "x" has a binding in the object environment record created when executing the |with| statement's substatement, and the object supplied to the |with| isn't the global object, the |var x| should do nothing whatsoever.  Presumably given this implementation unanimity the spec should change on this point.

In a certain sense this was flagged in <https://mail.mozilla.org/pipermail/es5-discuss/2011-January/003882.html> in acknowledging the current language to be narrowly scoped to the exact problem at hand.  I'm just pointing it out so it gets addressed in the likely future changes that happen to 10.5.


More information about the es-discuss mailing list