正如反复所说,使用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(...),同样,除了一些高级的边缘情况。
所以,现在我想知道:这些“高级边缘案例”是什么?Function 构造函数有合法用途吗?