正如反复提到的,使用Function构造函数被认为是不好的做法(另见ECMAScript语言规范,第 5 版,第15.3.2.1节):
new Function ([arg1[, arg2[, … argN]],] functionBody)
Run Code Online (Sandbox Code Playgroud)
(其中所有参数都是包含参数名称的字符串,最后一个(或唯一)字符串包含函数体).
要概括,它被认为是缓慢的,因为通过解释歌剧院团队:
每次
Function在表示源代码的字符串上调用构造函数时,脚本引擎必须启动将源代码转换为可执行代码的机制.这通常对性能来说很昂贵 - 例如,比简单的函数调用要贵一百倍.(Mark'Tarquin'Wilton-Jones)
虽然它并没有那么糟糕,但根据这篇关于MDC的帖子(我没有使用当前版本的Firefox自己测试).
克罗克福德补充说
引用该语言的惯例使得将函数体正确表达为字符串变得非常困难.在字符串形式中,无法进行早期错误检查.[...]它浪费了内存,因为每个函数都需要自己独立的实现.
另一个不同之处在于
由Function构造函数定义的函数不会继承除全局范围(所有函数都继承)之外的任何范围.(MDC)
除此之外,在创建new Function使用动态内容时,您必须注意避免注入恶意代码.
也就是说,TJ Crowder在回答中说
除了一些高级边缘情况之外,这里几乎从不需要类似的新函数(...).
所以,现在我想知道:这些"先进边缘案例"是什么?Function构造函数是否合法使用?
我在这里和那里看到一些关于修改JavaScript对象原型的不满意的评论?我个人不知道这可能是一个什么问题.例如,扩展Array对象以具有map和include方法或创建更强大的Date方法?