Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法在Node.js ES6中使用eval创建变量_Javascript_Node.js_Ecmascript 6_Eval_Mjs - Fatal编程技术网

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

Javascript 无法在Node.js ES6中使用eval创建变量,javascript,node.js,ecmascript-6,eval,mjs,Javascript,Node.js,Ecmascript 6,Eval,Mjs,在Node.js ES6中使用eval似乎不可能创建变量,但我不明白为什么。这在CentOS 7上发生在我身上,但我不认为操作系统是这里的问题 常规Node.js文件(test.js): 创建扩展名为.mjs的相同文件,以便与Node.js ES6(test.mjs)一起运行: 之后,使用Node.js和Node.js ES6运行2个文件: $ node test.js 1 $ node --experimental-modules test.mjs (node:9966) Experimen

在Node.js ES6中使用
eval
似乎不可能创建变量,但我不明白为什么。这在CentOS 7上发生在我身上,但我不认为操作系统是这里的问题

常规Node.js文件(test.js):

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

之后,使用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,这是一个bug还是背后有原因?

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


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

的行为差异。在严格模式中,在
eval()
语句中创建的变量仅对该代码可用。它不会在本地范围内创建新变量(这里有一个关于该主题的示例),而在非严格模式下,它可以在本地范围内创建变量


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

的行为发生差异,答案来自@jfriend00和我的测试:

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

eval("var a=1");
console.log(a);
var geval = eval;
geval("var a=1");
console.log(a);
但是,间接调用
eval
在es6类或.mjs文件中起作用:

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

根据@jfriend00和我的测试给出的答案:

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

eval("var a=1");
console.log(a);
var geval = eval;
geval("var a=1");
console.log(a);
但是,间接调用
eval
在es6类或.mjs文件中起作用:

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


这可能是一个范围问题。变量的作用域正好在
eval
范围内。它是全局作用域,启用模块时我怀疑只有2行代码,作用域规则会更改。我仍然不明白,“eval”和“console.log”在同一范围内,不是吗?我建议
eval
为正在执行的表达式创建一个嵌套范围。这可能是一个范围问题。变量的作用域正好在
eval
范围内。它是全局作用域,启用模块时我怀疑只有2行代码,作用域规则会更改。我仍然不明白,“eval”和“console.log”在同一范围内,不是吗?我建议
eval
为正在执行的表达式创建一个嵌套作用域。@Barmar-是的,我在编写之前已经确认了这一点,现在已经将其添加到我的答案中。ic、mjs和浏览器es6默认在严格模式下运行,在严格模式下eval中创建的变量在外部不可用,tks@jfriend00,是否有在局部范围内创建变量的解决方法?除了eval,我想不出其他任何东西,但我必须使用es6类。@datdinhquoc-您必须向我们展示您实际试图解决的真正的编码问题。通常,解决方案不是实际创建局部变量,而是创建一个基本对象,然后向该对象动态添加属性。这可以用普通Javascript来完成,即使在严格模式下也是如此。@jfriend00,tks,我现在使用object.property解决方案,向对象添加属性。eval创建变量有时是邪恶的,如果正在创建的变量已经在code@Barmar-是的,我在写之前已经确认了这一点,现在已经将其添加到我的答案中。默认情况下,ic、mjs和浏览器es6在严格模式下运行,并且在严格模式下的eval中创建的变量在外部不可用,tks@jfriend00,是否有在局部范围内创建变量的解决方法?除了eval,我想不出其他任何东西,但我必须使用es6类。@datdinhquoc-您必须向我们展示您实际试图解决的真正的编码问题。通常,解决方案不是实际创建局部变量,而是创建一个基本对象,然后向该对象动态添加属性。这可以用普通Javascript来完成,即使在严格模式下也是如此。@jfriend00,tks,我现在使用object.property解决方案,向对象添加属性。创建变量的eval有时是邪恶的,如果正在创建的变量已经在报告的codetks中,它可能会破坏代码,我没有在nodejs 12或node nightlytks上测试报告,我没有在nodejs 12或node nightly上测试