似乎无法在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,这是一个错误还是背后的原因?
在严格模式下,在eval()
语句中创建的变量仅对该代码可用。它不会在本地范围内创建新变量(这里是关于该主题的good article),而它可以在非严格模式下在本地范围内创建变量。
并且,mjs模块默认以严格模式运行。默认情况下,常规node.js脚本文件不处于严格模式。因此,严格模式设置的差异会导致eval()
行为的差异。
来自@ 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);