我正在阅读Airbnb JavaScript样式指南,我看到了提到以下功能的这部分:
var subtract = Function('a', 'b', 'return a - b');在Chrome调试器控制台中,我输入了上面的一行,然后输入:
subtract(7,3)它还给了4。我很惊讶它真的起作用了。
样式指南提到这样做不是个好主意,但它让我想到了这个函数语法。我从来没有见过一个函数没有身体返回一个适当的结果。
这是如何/为什么工作,它已经存在了多长时间,以及使用它的指南/最佳实践是什么?
发布于 2016-05-23 01:21:26
这将使用对象而不是“普通”function语法创建一个函数。注意大写"F“。
var subtract = Function('a', 'b', 'return a - b');意味着使用参数a和b以及body return a - b定义函数。它相当于
var subtract = function (a, b) { return a - b; };通常,在调用这样的构造函数时,您希望使用new,但是如果没有它,它也会工作得很好;它只是有点难读(对人类来说)。
根据Mozilla开发人员网络的解释:
Function构造函数创建一个新的Function对象。在JavaScript中,每个函数实际上都是一个Function对象。 语法new Function ([arg1[, arg2[, ...argN]],] functionBody)参数arg1**,**arg2**,...**argN函数用作形式参数名称的名称。每个字符串必须对应于有效的JavaScript标识符或用逗号分隔的此类字符串列表;例如"x“、"theValue”或"a,b“。functionBody包含包含函数定义的JavaScript语句的字符串。 ..。 将Function构造函数作为函数调用(而不使用new操作符)的效果与作为构造函数调用它的效果相同。
发布于 2016-05-23 01:23:16
取自MDN。
函数构造函数创建一个新的函数对象。在JavaScript中,每个函数实际上都是一个函数对象。
在你的样本里,
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;发布于 2016-05-23 02:20:26
构造函数
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函数构造函数定义JavaScript函数,称为Function()。这与使用表达式定义匿名函数的结果相同。
使用表达式的匿名函数:
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代码,从而打开漏洞。https://stackoverflow.com/questions/37381360
复制相似问题