为什么 new Function 不能像 eval 那样工作?

Why new Function not work as eval?

例如,我有一个代码(具有新功能)可以打开警报 window

   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`; 

不工作?

当您在 JavaScript 中使用反引号时,它被称为模板文字。详情可以看this document

基本上,您在反引号中传递给函数的字符串作为参数传递给您尚未定义函数的函数。当在函数中使用反引号时,它被称为标记模板文字。您需要首先定义函数(如何对传入的字符串进行数学运算)。在你的例子中,你想使用 eval,所以你的标签应该是这样的:

const myTaggedTemplateLiteral = (evalStrings) => eval(evalStrings[0]);
myTaggedTemplateLiteral`2+2` // 4

最初的问题是:

Why is the code: new Function2+2; not working?

为了简单地解释这一点,您必须查找 JavaScript Function 构造函数将采用哪些参数:MDN Function 如您所见,所需的输入是字符串:

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

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

如果你这样做:

new Function`2+2`;

您将简单地创建一个匿名实例,不使用任何值或 return 值。这就是为什么输出将是 anonymous {}

I think it's impossible to use function call with template string for calculating, it works only with single quotes or double quotes

我可以证明它会起作用 - 有不同的方法可以解决这个问题:

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

我想您现在可以理解如何使用 Function 构造函数和 tagged templates。重要的部分是使用参数对象并访问您想要的 return 值。

带评估的旧答案:

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

更多信息:

我认为用函数调用模板字符串来计算是不可能的,它只适用于单引号或双引号

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

console.log(result); // 4

你应该在计算前出return:

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

如果你想让它动态化,只需添加参数

var a = new Function("x", "y", "return x+y");