无法在 Node.js ES6 中使用 eval 创建变量
Fail to create variable using eval in Node.js ES6
似乎无法在 Node.js ES6 中使用 eval
创建变量,但我不明白为什么。这发生在 CentOS 7 上,但我不认为 OS 是这里的问题。
常规 Node.js 文件 (test.js):
eval("var a=1");
console.log(a);
使用 Node.js ES6 (test.mjs):
将扩展名为 运行 的相同文件扩展为 .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 class 或 .mjs 文件中不起作用:
eval("var a=1");
console.log(a);
但是,间接调用 eval
在 es6 class 或 .mjs 文件中确实有效:
var geval = eval;
geval("var a=1");
console.log(a);
似乎无法在 Node.js ES6 中使用 eval
创建变量,但我不明白为什么。这发生在 CentOS 7 上,但我不认为 OS 是这里的问题。
常规 Node.js 文件 (test.js):
eval("var a=1");
console.log(a);
使用 Node.js ES6 (test.mjs):
将扩展名为 运行 的相同文件扩展为 .mjseval("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 class 或 .mjs 文件中不起作用:
eval("var a=1");
console.log(a);
但是,间接调用 eval
在 es6 class 或 .mjs 文件中确实有效:
var geval = eval;
geval("var a=1");
console.log(a);