为什么新功能不能像eval一样起作用?

时间:2018-08-28 14:09:05

标签: javascript function eval calculation ecmascript-7

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

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

eval上的相同代码

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

但是为什么要使用计算:

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

评估正常工作:

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

问题:

为什么是代码:

 new Function`2+2`; 

不起作用?

4 个答案:

答案 0 :(得分:1)

最初的问题是:

  

代码为何如此:new Function 2+2;不起作用?

要简单地举例说明,您必须查看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`;

您将简单地创建一个匿名实例,而不包含任何要使用或返回的值。这就是为什么输出将为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`;

有关更多信息:

答案 1 :(得分:0)

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

基本上,您在反引号中传递给函数的字符串将作为参数传递给函数,而您尚未定义函数。当使用带有功能的反引号时,它称为标记模板文字。您将需要首先定义函数(如何对传入的字符串进行数学运算)。在您的情况下,您想使用eval,因此您的标签应如下所示:

$auxArr = array();
foreach($busyUsers as $bU ){
   array_push($auxArr, $bU->user_id);
}

array_filter($freeUsers, function($value, $key) {
    return in_array($value->user_id, $auxArr);
}, ARRAY_FILTER_USE_BOTH)

答案 2 :(得分:0)

我认为无法使用带有模板字符串的函数调用进行计算,它仅适用于单引号或双引号

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

console.log(result); // 4

答案 3 :(得分:-2)

您应该在计算之前返回:

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

如果要使其动态化,只需添加参数

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