我正在阅读Airbnb JavaScript样式指南,我遇到this部分提到了以下功能:
var subtract = Function('a', 'b', 'return a - b');
我在Chrome调试器控制台中测试了这一点,输入上面的行,然后输入:
subtract(7,3)
并返回4
。我很惊讶它确实有效。
样式指南提到这样做并不是一个好主意,但它让我想到了这个函数语法。我从来没有见过没有身体的功能会恢复正常的结果。
这是如何/为什么这样做,它有多长时间,以及使用它的指导方针/最佳做法是什么?
答案 0 :(得分:4)
这会使用Function
object而不是“普通”function
语法创建一个函数。注意大写字母“F”。
var subtract = Function('a', 'b', 'return a - b');
表示您使用参数a
和b
定义具有正文return a - b
的函数。它相当于
var subtract = function (a, b) { return a - b; };
通常,你想在调用这样的构造函数时使用new
,但没有它就可以正常工作;它只是有点难以阅读(对人类而言)。
来自Mozilla Developer Network解释:
Function
构造函数会创建一个新的Function
对象。在JavaScript中 每个函数实际上都是Function
个对象。语法
new Function ([arg1[, arg2[, ...argN]],] functionBody)
参数
arg1
,arg2
,...argN
函数使用的名称为formal 参数名称。每个必须是对应于有效的字符串 JavaScript标识符或用a分隔的此类字符串列表 逗号;例如“x”,“theValue”或“a,b”。<强>
functionBody
强>
一个字符串 包含构成该函数的JavaScript语句 定义...
将
Function
构造函数作为函数调用(不使用new
运算符)与将其作为构造函数调用具有相同的效果。
答案 1 :(得分:2)
取自MDN。
Function构造函数创建一个新的Function对象。在JavaScript中 每个函数实际上都是一个Function对象。
在您的样本中,
var subtract = Function('a', 'b', 'return a - b');
a
和b
是将传递给函数体的参数,即return a - b
。
最后一个参数将始终是函数体
所以,如果你传递它,
var subtract = Function('a', 'b');
// Reference error b is not defined
此示例实际上等于,
var subtract = Function('a, b', 'return a - b');
或者在其他版本中,
var subtract = function(a, b) { return a - b; };
或
var subtract = (a, b) => a - b;
答案 2 :(得分:0)
构造函数
var subtract = Function('a', 'b', 'return a - b');
或
var subtract = new Function('a', 'b', 'return a - b');
var result = subtract(10, 5); // result : 5
这是一个Javascript函数,它具有一个名为Function()
的内置JavaScript函数构造函数。这与使用表达式定义匿名函数的结果相同:
使用表达式的匿名函数:
var subtract = function(a, b) { return a - b); }
var result = subtract(10, 5); // result : 5
构造函数语法:
new Function ([arg1[, arg2[, ...argN]],] functionBody)
所有参数(字符串)都是可选的,带有必需的functionBody
(字符串)。它使用eval()
函数来评估字符串。它返回一个新的函数对象,用于调用函数。
应避免使用构造函数:
eval()
来评估字符串eval()
可以执行任何javascript代码,从而打开漏洞