无法在Node.js ES6中使用eval创建变量

问题描述 投票:0回答:2

似乎无法在Node.js ES6中使用eval创建变量,但我无法理解为什么。这在CentOS 7上发生在我身上,但我不相信操作系统是这里的问题。

Regular Node.js文件(test.js):

eval("var a=1");
console.log(a);

使用.mjs扩展名创建相同的文件以与Node.js ES6(test.mjs)一起运行:

eval("var a=1");
console.log(a);

之后,使用Node.js和Node.js ES6运行2个文件:

$ node test.js
1

$ node --experimental-modules test.mjs
(node:9966) ExperimentalWarning: The ESM module loader is experimental.
ReferenceError: a is not defined
    at file:///temp/test.mjs:2:13
    at ModuleJob.run (internal/modules/esm/module_job.js:96:12)

这是与ES6相关的问题吗?我试过浏览器的控制台,问题是一样的:

>> eval("var a=1"); console.log(a);
   1

>> class c { static f(){ eval("var a=1"); console.log(a); } }
   c.f()
   ReferenceError: a is not defined

我正在使用Node.js 10.9.0,这是一个错误还是背后的原因?

javascript node.js ecmascript-6 eval mjs
2个回答
3
投票

在严格模式下,在eval()语句中创建的变量仅对该代码可用。它不会在本地范围内创建新变量(这里是关于该主题的good article),而它可以在非严格模式下在本地范围内创建变量。

并且,mjs模块默认以严格模式运行。默认情况下,常规node.js脚本文件不处于严格模式。因此,严格模式设置的差异会导致eval()行为的差异。


0
投票

来自@ jfriend00的回答和我的测试:

直接调用eval在es6类或.mjs文件中不起作用:

eval("var a=1");
console.log(a);

但是,调用eval INDIRECTLY可以在es6类或.mjs文件中工作:

var geval = eval;
geval("var a=1");
console.log(a);
© www.soinside.com 2019 - 2024. All rights reserved.