【发布时间】:2011-03-02 20:24:22
【问题描述】:
正如反复所说,使用Function constructor 被认为是不好的做法(另见ECMAScript Language Specification,第 5th 版,第 15.3.2.1 节):
new Function ([arg1[, arg2[, … argN]],] functionBody)
(其中所有参数都是包含参数名称的字符串,最后一个(或唯一一个)字符串包含函数体)。
概括地说,据说很慢,正如the Opera team所解释的那样:
每次 […]
Function在字符串上调用构造函数 代表源代码,脚本 发动机必须启动机器 将源代码转换为可执行文件 代码。这通常是昂贵的 性能——轻松一百倍 比一个简单的功能更昂贵 打电话,例如。 (马克“塔昆”威尔顿-琼斯)
虽然不是那么很糟糕,但根据 MDC 上的this post(不过,我自己并没有使用当前版本的 Firefox 进行测试)。
克罗克福德adds那个
[t]他的引用约定 语言让人很难 正确地将函数体表示为 细绳。在字符串形式中,早期 无法进行错误检查。 […] 和 这是浪费内存,因为每个 功能需要自己独立 实施。
另一个区别是
由函数定义的函数 构造函数不继承任何范围 除了全局范围(所有 函数继承)。 (MDC)
除此之外,当您使用动态内容创建new Function 时,您必须注意避免注入恶意代码。
也就是说,T.J.克劳德在an answer 中说
[t]这里几乎不需要 类似的 [...] new Function(...), 或者,再次除了一些高级 边缘情况。
所以,现在我想知道:这些“高级边缘案例”是什么? Function 构造函数有合法用途吗?
【问题讨论】:
-
使用
new Function时,严格模式下的ES5不会抛出... -
@Šime:根据规范(附件 C),它应该:“尝试使用 Function 构造函数 (15.3.2) 动态定义此类严格模式函数将引发
SyntaxError异常” ,但测试表明它没有。我是不是误会了什么? -
好吧,读上一句。 “如此严格的模式函数”是指名称或参数之一为“eval”或“arguments”的函数。
标签: javascript function-constructor