正如反复所说,使用Function 构造函数被认为是不好的做法(另见ECMAScript 语言规范,第5版,第 15.3.2.1 节):
new Function ([arg1[, arg2[, … argN]],] functionBody)
(其中所有参数都是包含参数名称的字符串,最后一个(或唯一的)字符串包含函数体)。
概括地说,据说它很慢,正如Opera 团队所解释的那样:
每次
Function
在表示源代码的字符串上调用构造函数时,脚本引擎必须启动将源代码转换为可执行代码的机制。这对于性能来说通常是昂贵的——例如,很容易比简单的函数调用贵一百倍。(马克“塔昆”威尔顿-琼斯)
虽然这不是说不好,根据这个帖子上的MDC(我没有使用Firefox的最新版本,虽然测试此我自己)。
克罗克福德补充说
[t]语言的引用约定使得将函数体正确表达为字符串非常困难。在字符串形式中,不能进行早期错误检查。[…]而且浪费内存,因为每个函数都需要自己独立的实现。
另一个区别是
由 Function 构造函数定义的函数不会继承除全局作用域(所有函数都继承)之外的任何作用域。( MDC )
除此之外,当您创建new Function
动态内容时,您必须注意避免注入恶意代码。
也就是说,TJ Crowder 在回答中说
[t] 这里几乎不需要类似的 [...] new Function(...),同样,除了一些高级边缘情况。
所以,现在我想知道:这些“高级边缘情况”是什么?函数构造函数是否有合法用途?