Lexical scoping of 'function' in sloppy mode breaks legal ES5

Andreas Rossberg rossberg at google.com
Mon Aug 19 08:38:26 PDT 2013


While debugging a V8 issue I just realised another incompatibility
with introducing lexical function declarations in sloppy mode that I
think we haven't observed yet. Consider the following code:

function f() {
  var x = 0
  try {
    throw 1
  } catch (x) {
    eval("function g() { return x }")
  }
  return g()
}

This function is legal, and supposed to return 1 according to my
reading of the ES5 spec. But lexically scoped function declarations
should make it throw a ReferenceError instead.

Unlike the other legacy issues with sloppy-mode lexical function
scoping that we have discussed before this one is actually covered by
the current spec. Is such a breaking change an issue? V8 currently
crashes on the above code, so this particular example probably is not
a real-world problem. 8) However, there are simpler examples, e.g.:

function f() {
  if (true) { eval("function g() { return 1 }") }
  return g()
}

Do we know if this is something that occurs in practice?

/Andreas


More information about the es-discuss mailing list