Javascript 为什么新功能不能像eval一样工作?

Javascript 为什么新功能不能像eval一样工作?,javascript,function,eval,calculation,ecmascript-2016,Javascript,Function,Eval,Calculation,Ecmascript 2016,例如,我有一个代码(带有新函数),它将打开一个警报窗口 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+

例如,我有一个代码(带有新函数),它将打开一个警报窗口

   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中使用反勾号时,称为模板文本。您可以查看详细信息

基本上,您在backticks中传递给函数的字符串作为参数传递给函数,但您尚未定义函数。当对函数使用backticks时,它被称为标记的模板文本。您需要首先定义函数(如何对传入的字符串进行数学运算)。在您的情况下,您希望使用eval,因此您的标记应该如下所示:

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

最初的问题是:

代码为何:新功能
2+2
;不工作

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

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]
我认为您现在可以理解如何使用
函数
构造函数和
标记模板
。重要的部分是使用arguments对象并访问所需的返回值

带eval的旧答案:

const myFunc = evalStr => console.log(eval(evalStr[0]));
myFunc`2+2`;
有关更多信息:


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

const result=new函数('return 2+2')();

console.log(结果);//4
您应该在计算前返回:


var a=新函数(“返回2+2”)你的意思是
新功能(“2+2”)带括号?如果你不使用括号,你实际上不会调用任何东西。@zero298错了!这是es6/7中的正确代码。使用ES6/7,您可以调用传递模板文字的函数。@Megajin您可以显示相关文档吗?我从未见过使用过,在MDN文档中也找不到:@zero298相关部分是“标记的模板”。请删除此答案!这段代码是从我的评论中复制粘贴的。只有答案是错误的做法,你至少应该解释一下你在做什么。我可以证明你错了,这是可能的标签模板。看看我的答案。@Megajin,谢谢你的回答,但我想在没有evalOk的情况下使用新函数,我可以证明有一种方法。给我几分钟,我会编辑我的答案。谢谢你的回答,但我想使用不带evalthanks的新函数作为你的答案,但我想使用不带eval的新函数。我确实在我的答案中添加了更多细节,现在应该清楚了=)。新函数('return arguments[1]')
${2+2}
;这将立即执行(当您发送参数时),它将被解释为新函数(“返回参数[1]”)
${4}
,这没有意义;2+2应该作为字符串而不是数字发送4您可以执行
'${2+2}'
'2+2'
并在参数中解释它。一切皆有可能,我只是想向您展示,您“可以”使用模板文本。顺便说一下,这个
新函数('return 2+2')
将被解释为
Function(){return 2+2;}
,因此它与我所示的相同,但带有模板文本。