11

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!

jooas
  • 117
  • 1
  • 9
  • There is a way to use let and const in eval, see https://stackoverflow.com/q/67322922/387194 – jcubic Apr 05 '23 at 21:48

2 Answers2

12

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).

RobG
  • 142,382
  • 31
  • 172
  • 209
11

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:

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:

rsp
  • 107,747
  • 29
  • 201
  • 177