Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Define const variable using eval()

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!

like image 829
jooas Avatar asked Apr 03 '17 15:04

jooas


People also ask

What does eval () do in JavaScript?

The eval() function evaluates JavaScript code represented as a string and returns its completion value. The source is parsed as a script.

How do you use eval function?

The Eval function evaluates the string expression and returns its value. For example, Eval("1 + 1") returns 2. If you pass to the Eval function a string that contains the name of a function, the Eval function returns the return value of the function. For example, Eval("Chr$(65)") returns "A".

What does const {} mean in JavaScript?

The const declaration creates a read-only reference to a value. It does not mean the value it holds is immutable—just that the variable identifier cannot be reassigned. For instance, in the case where the content is an object, this means the object's contents (e.g., its properties) can be altered.

What is $$ eval?

$$eval() method. This method runs Array. from(document. querySelectorAll(selector)) within the page and passes the result as the first argument to the pageFunction .


2 Answers

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

like image 135
RobG Avatar answered Oct 01 '22 15:10

RobG


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
like image 20
rsp Avatar answered Oct 01 '22 17:10

rsp