Почему новая функция не работает как eval? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть, например, код (с новой функцией), который откроет окно предупреждения

   new Function`alert(1)`; // Works OK

Тот же код на eval

   eval('alert(1)'); // Works OK

Но почему, если я использую вычисления:

 new Function`2+2`; // not works, shows {}

Eval работает правильно:

   eval('2+2'); // Works OK , will be 4 

Вопрос:

Почему код:

 new Function`2+2`; 

не работает?

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Вы должны вернуться до расчета:

var a = new Function("return 2+2");

Если вы хотите сделать его динамичным, просто добавьте аргументы

var a = new Function("x", "y", "return x+y");
0 голосов
/ 28 августа 2018

Первоначальный вопрос был:

Почему код: новая функция 2+2; не работает?

Чтобы просто объяснить это, вам нужно посмотреть, какие параметры принимает конструктор JavaScript Function: Функция MDN Как видите, желаемыми входными данными являются строки:

const sum = new Function('a', 'b', 'return a + b');

console.log(sum(2, 6));
// expected output: 8

Если вы делаете:

new Function`2+2`;

Вы просто создадите анонимный экземпляр без каких-либо значений для использования или возврата значений. Поэтому на выходе будет anonymous {}

Я думаю, что невозможно использовать вызов функции со строкой шаблона для расчет, он работает только с одинарными или двойными кавычками

Я могу доказать, что это будет работать - есть разные способы решения этой проблемы:

new Function('return arguments[1]')`${2+2}`; // outputs 4
new Function`return Object.entries(arguments)[0]`(2+2); // outputs ['0',4]

Думаю, теперь вы можете понять, как работать с конструктором Function и tagged templates. Важной частью является работа с объектом arguments и доступ к желаемому возвращаемому значению.

старый ответ с eval:

const myFunc = evalStr => console.log(eval(evalStr[0]));
myFunc`2+2`;

Для получения дополнительной информации:

0 голосов
/ 28 августа 2018

Я думаю, что невозможно использовать вызов функции со строкой шаблона для вычисления, она работает только с одинарными или двойными кавычками

const result = new Function('return 2+2')();

console.log(result); // 4
0 голосов
/ 28 августа 2018

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

По сути, строка, которую вы передаете функции в кавычках, передается в качестве параметров функции, для которой вы не определили функцию. Когда используются обратные пометки с функцией, она называется tagged-template-literal. Сначала вам нужно определить функцию (как сделать математику для переданной строки). В вашем случае вы хотите использовать eval, поэтому ваш тег должен выглядеть так:

const myTaggedTemplateLiteral = (evalStrings) => eval(evalStrings[0]);
myTaggedTemplateLiteral`2+2` // 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...