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;}
,因此它与我所示的相同,但带有模板文本。