When I try to define a variable using var, everything is working.
But defining it as const is not working as expected and the variable is undefined.
window.eval("var v = 5;");
document.body.innerHTML += window.v === undefined;
window.eval("const l = 5;");
document.body.innerHTML += window.l === undefined;
I have tested it on Chrome and Node.js. Am I missing something?
Thank you in advance!
That is because const
turns on the strict mode by default. See what happens when you turn on the strict mode for both examples explicitly:
window.eval("'use strict'; var v = 5;");
document.body.innerHTML += window.v === undefined;
window.eval("'use strict'; const l = 5;");
document.body.innerHTML += window.l === undefined;
For more info on the strict mode see:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
In particular this part:
Second, eval of strict mode code does not introduce new variables into the surrounding scope. In normal code eval("var x;") introduces a variable x into the surrounding function or the global scope. This means that, in general, in a function containing a call to eval every name not referring to an argument or local variable must be mapped to a particular definition at runtime (because that eval might have introduced a new variable that would hide the outer variable). In strict mode eval creates variables only for the code being evaluated, so eval can't affect whether a name refers to an outer variable or some local variable [emphasis added]
See also this article:
- New ES5 strict mode support: new vars created by strict mode eval code are local to that code only
Using let and const in eval code doesn't invoke strict mode. let and const are lexicalDeclarations, which limits their scope to the enclosing lexical scope.
A lexical scope is created by a block and by direct call to eval (see Runtime Semantics: PerformEva step 12).