Function类如何工作?

时间:2016-05-23 01:18:54

标签: javascript

我正在阅读Airbnb JavaScript样式指南,我遇到this部分提到了以下功能:

var subtract = Function('a', 'b', 'return a - b');

我在Chrome调试器控制台中测试了这一点,输入上面的行,然后输入:

subtract(7,3)

并返回4。我很惊讶它确实有效。

样式指南提到这样做并不是一个好主意,但它让我想到了这个函数语法。我从来没有见过没有身体的功能会恢复正常的结果。

这是如何/为什么这样做,它有多长时间,以及使用它的指导方针/最佳做法是什么?

3 个答案:

答案 0 :(得分:4)

这会使用Function object而不是“普通”function语法创建一个函数。注意大写字母“F”。

var subtract = Function('a', 'b', 'return a - b');

表示您使用参数ab定义具有正文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)

     

参数

     

arg1arg2,... 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');

ab是将传递给函数体的参数,即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()函数来评估字符串。它返回一个新的函数对象,用于调用函数。

应避免使用构造函数:

  1. 因为它使用函数eval()来评估字符串
  2. ,所以速度很慢
  3. 在这样的功能
  4. 中调试线路更难
  5. eval()可以执行任何javascript代码,从而打开漏洞