例如,我有一个代码(带有新功能),它将打开一个警报窗口
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`;
不起作用?
答案 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");