Не удалось создать переменную с помощью eval в Node.js ES6 - PullRequest
0 голосов
/ 04 сентября 2018

Кажется невозможным создать переменную, используя eval в Node.js ES6, но я не могу понять, почему. Это происходит со мной в CentOS 7, но я не верю, что проблема здесь в ОС.

Обычный файл Node.js (test.js):

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

Создайте тот же файл с расширением .mjs для запуска с Node.js ES6 (test.mjs):

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

После этого запустите 2 файла с Node.js и Node.js ES6:

$ 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, это баг или есть причина?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

С ответом от @ jfriend00 и из моего тестирования:

Вызов eval напрямую не работает в классе es6 или файле .mjs:

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

Однако вызов eval НЕПОСРЕДСТВЕННО работает в классе es6 или в файле .mjs:

var geval = eval;
geval("var a=1");
console.log(a);
0 голосов
/ 04 сентября 2018

В строгом режиме переменные, созданные внутри оператора eval(), доступны только для этого кода. Он не создает новые переменные в вашей локальной области видимости (вот хорошая статья по этой теме), тогда как он может создавать переменные в локальной области видимости, когда не в строгом режиме.

И модули mjs по умолчанию работают в строгом режиме. Обычный файл сценария node.js не находится в строгом режиме по умолчанию. Таким образом, разница в настройке строгого режима приводит к разнице в поведении eval().

...