首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数构造函数与函数语句

函数构造函数与函数语句
EN

Stack Overflow用户
提问于 2010-09-26 18:50:16
回答 4查看 4.7K关注 0票数 11

今天我读过我们有一种通过函数构造函数声明函数的方法。但我从未见过实际使用Function构造函数的实际实现。因此,我想问一问,在什么情况下,我们可以通过使用Function构造函数而不是使用function()声明来获得好处?两者之间隐藏的区别是什么?(如果有)

函数构造器

代码语言:javascript
复制
var func = new Function("x", "y", "return x*y;"); // pass the context by String

职能():

代码语言:javascript
复制
var func = function(x, y){ return x*y; }

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-26 18:54:18

函数构造函数是eval的一种形式,通常应该避免它(它很慢而且被认为是不安全的)。在内置函数语句上使用函数构造函数是没有好处的,除非您想要用动态组件构造函数,这是非常罕见的。这种形式有合法的用途,但是大多数时候它是不必要地使用的,这就是为什么它被轻视和通常避免的原因。

此外,使用函数构造函数创建的函数不会保留对它们在(闭包)中定义的环境的引用。执行时,它们将直接从全局范围中提取这些变量。

代码语言:javascript
复制
var f, a;
(function () {
   var a = 123;
   f = new Function("return a");
})();

f(); //undefined

a = "global"
f(); // "global"

虽然常规函数确实引用了定义它们的环境:

代码语言:javascript
复制
var f;
(function () {
   var a = 123;
   f = function () { return a; }
})();
f(); //123
票数 10
EN

Stack Overflow用户

发布于 2010-09-26 18:53:39

那么,在处理字符串时,最明显的区别是您可以通过在运行时构造字符串(与使用eval时一样)来选择元编程。然而,这是双刃剑,可以说导致了一系列其他问题,包括文字连接(注入),或者简单的复杂性。如果你不需要字符串版本,我不会用它来说实话。

常规(非字符串)版本的一个副作用是,大多数javascript小型程序(或混淆器)都知道如何处理它。对于字符串来说,这似乎不太可能,也就是说,它们将保持原样(而不是缩小或混淆)。

票数 2
EN

Stack Overflow用户

发布于 2010-09-26 18:53:52

如果您正在编写Javascript解析器并将字符串解释为函数,则可以使用函数构造函数。如果你被给予了:

代码语言:javascript
复制
"function(x){return x+2}"

还有一些词法解析器,它发现子字符串确实是一个函数,要将它转换成一个真正的函数,您可以使用new Function并将它添加到树中。

否则,我想不出有多大用处。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3799295

复制
相关文章

相似问题

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