non-strict direct eval in top level scope
Firefox's engine has an ES4-era prototype let implementation, a bug to
fix by implementing ES6 semantics.
On Jan 22, 2015, at 5:03 PM, Francisco Tolmasky wrote:
Apologies as I believe this has been discussed before ( esdiscuss.org/topic/block-scope-direct-non-strict-eval ), but just trying to get some clarification as to the current state of things, and have not been able to find this information (in a format I can understand). Namely, I’m curious whether eval(“let x = 5”) adds x to the current scope, if not in strict mode, at the “top level” (i.e. not in a function) and called directly. My impression was that with let it should not be adding anything to the current scope, but my tests in Mozilla Firefox (in the console) seem to suggest they do:
eval always adds lexical declarations (let/const/class) in a lexical environment that only exists for the duration of the eval. See people.mozilla.org/~jorendorff/es6-draft.html#sec
Apologies as I believe this has been discussed before ( esdiscuss.org/topic/block-scope-direct-non-strict-eval ), but just trying to get some clarification as to the current state of things, and have not been able to find this information (in a format I can understand). Namely, I’m curious whether eval(“let x = 5”) adds x to the current scope, if not in strict mode, at the “top level” (i.e. not in a function) and called directly. My impression was that with let it should not be adding anything to the current scope, but my tests in Mozilla Firefox (in the console) seem to suggest they do:
> eval(“let x = 5”) > undefined > x > 5In fact, even in functions:
> (function() { eval("let xyz = 555"); console.log(xyz) })() > 555In if statements, it seems to be tacked onto the global scope:
> if (true) { eval(“let x = 5”) } x > 5If these are just bugs that’s fine, but if not, could someone tell me the expected behavior? Is it always supposed to act as if its creating a new scope for the blocks, or always except for top level evals? Or never?
Thanks,
Francisco
Apologies as I believe this has been discussed before ( https://esdiscuss.org/topic/block-scope-direct-non-strict-eval ), but just trying to get some clarification as to the current state of things, and have not been able to find this information (in a format I can understand). Namely, I’m curious whether eval(“let x = 5”) adds x to the current scope, if not in strict mode, at the “top level” (i.e. not in a function) and called directly. My impression was that with let it should not be adding anything to the current scope, but my tests in Mozilla Firefox (in the console) seem to suggest they do: > eval(“let x = 5”) > undefined > x > 5 In fact, even in functions: > (function() { eval("let xyz = 555"); console.log(xyz) })() > 555 In if statements, it seems to be tacked onto the global scope: > if (true) { eval(“let x = 5”) } x > 5 If these are just bugs that’s fine, but if not, could someone tell me the expected behavior? Is it always supposed to act as if its creating a new scope for the blocks, or always *except* for top level evals? Or never? Thanks, Francisco -- Francisco Tolmasky www.tolmasky.com tolmasky at gmail.com -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20150122/5ccad9e7/attachment.html>