Javascript 使用toString获取函数名有什么风险?

Javascript 使用toString获取函数名有什么风险?,javascript,ecmascript-5,es5-compatiblity,Javascript,Ecmascript 5,Es5 Compatiblity,因为ES5不支持。我正在寻找一种方法来模拟这种功能。虽然很多人建议使用,但也有人强烈反对 那么,使用下面的代码获取函数名有什么风险呢 if (!Object.hasOwnProperty(Function.prototype, "name")) { Object.defineProperty(Function.prototype, "name", { configurable: false, enumerable: true, get: function() {

因为ES5不支持。我正在寻找一种方法来模拟这种功能。虽然很多人建议使用,但也有人强烈反对

那么,使用下面的代码获取函数名有什么风险呢

if (!Object.hasOwnProperty(Function.prototype, "name")) {
  Object.defineProperty(Function.prototype, "name", {
    configurable: false,
    enumerable: true,
    get: function() {
      var result = /function\s+([^\s(]+)/.exec(this.toString());
      return result ? result[1] : "";
    }
  });
}
由于ES5不支持,我真的不知道什么时候会有风险。

正如所说的,
toString
方法返回一个字符串,该字符串的语法如下:

Function.prototype.toString() 返回函数的依赖于实现的表示形式。此表示具有FunctionDeclaration的语法。请特别注意,表示字符串中空格、行终止符和分号的使用和放置取决于实现

toString
函数不是通用函数;如果其值不是函数对象,则抛出类型错误异常。因此,不能将其传输到其他类型的对象以用作方法

FunctionDeclaration具有以下语法:

函数声明:

函数标识符FormalParameterListopt){函数体}

格式参数列表:

标识符
FormalParameterList标识符

定义如下:

标识符::

标识名称但不保留字

标识名称::

IdentifierStart
IdentifierName IdentifierPart

标识开始::

单删除器
$
\uu
\单链构图序列

标识部分::

IdentifierStart
Unicode DecombiningMark
UnicodeDigit
Uniconnectorputuation

结论 虽然获取函数名不是一种很好的方法(但ES5中的唯一方法是),但如果您让它解析上面列出的所有可能性,它可以在ES5中安全地工作

但是ES6标准修改了
.toString()
的规范,这意味着更多可能的语法,使得在其中使用此方法不安全


因此,仅在ES6之前的版本中使用此方法。

您可能希望解释更不寻常的函数名(最突出的是,
$
)。也许吧,因为可以假设Javascript语法已经是valid@CertainPerformance像
function\s+([^\s(+]+)
这样的东西是否有效?我的想法是,正在检查的任何函数都将已经有一个有效的名称,因此名称的结尾应该在空格(空格、制表符、新行…)或
已找到。当然,匹配的尾随部分不是必需的,只是感觉更坚实而已。请确保从表中处理所有(适当的)情况。特别是,
func.toString
并不总是以“function”开头@georg在我看来,所有ES5兼容的示例都是从
函数开始的
不确定您是说我的代码足够,还是我需要修改它。如果是后者,您能否给出一个函数声明的示例,这可能会导致问题?@nickzoum您的代码现在是可以的;但根据