首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数类是如何工作的?

函数类是如何工作的?
EN

Stack Overflow用户
提问于 2016-05-23 01:18:54
回答 3查看 95关注 0票数 4

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

代码语言:javascript
复制
var subtract = Function('a', 'b', 'return a - b');

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

代码语言:javascript
复制
subtract(7,3)

它还给了4。我很惊讶它真的起作用了。

样式指南提到这样做不是个好主意,但它让我想到了这个函数语法。我从来没有见过一个函数没有身体返回一个适当的结果。

这是如何/为什么工作,它已经存在了多长时间,以及使用它的指南/最佳实践是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-23 01:21:26

这将使用对象而不是“普通”function语法创建一个函数。注意大写"F“。

代码语言:javascript
复制
var subtract = Function('a', 'b', 'return a - b');

意味着使用参数ab以及body return a - b定义函数。它相当于

代码语言:javascript
复制
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操作符)的效果与作为构造函数调用它的效果相同。

票数 3
EN

Stack Overflow用户

发布于 2016-05-23 01:23:16

取自MDN

函数构造函数创建一个新的函数对象。在JavaScript中,每个函数实际上都是一个函数对象。

在你的样本里,

代码语言:javascript
复制
var subtract = Function('a', 'b', 'return a - b');

ab是将传递给函数体(即return a - b )的参数。

最后一个参数总是函数体。

所以如果你像这样通过了,

代码语言:javascript
复制
var subtract = Function('a', 'b');
// Reference error b is not defined

这个样本实际上等于,

代码语言:javascript
复制
var subtract = Function('a, b', 'return a - b');

或者其他版本,

代码语言:javascript
复制
var subtract = function(a, b) { return a - b; };

代码语言:javascript
复制
var subtract = (a, b) => a - b;
票数 2
EN

Stack Overflow用户

发布于 2016-05-23 02:20:26

构造函数

代码语言:javascript
复制
var subtract = Function('a', 'b', 'return a - b');

代码语言:javascript
复制
var subtract = new Function('a', 'b', 'return a - b');

var result = subtract(10, 5);   // result : 5

这是用内置的Javascript函数构造函数定义JavaScript函数,称为Function()。这与使用表达式定义匿名函数的结果相同。

使用表达式的匿名函数:

代码语言:javascript
复制
var subtract = function(a, b) { return a - b); }

var result = subtract(10, 5);   // result : 5

构造函数语法:

代码语言:javascript
复制
new Function ([arg1[, arg2[, ...argN]],] functionBody)

所有参数(字符串)都是可选的,需要一个functionBody (字符串)。它使用eval()函数计算字符串。它返回一个新函数对象,用于调用该函数。

应该避免使用构造函数的函数,如:

  1. 它很慢,因为它使用函数eval()来计算字符串。
  2. 在这样的函数中调试行比较困难。
  3. eval()可以执行任何javascript代码,从而打开漏洞。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37381360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档