使用 toString 获取函数名称的风险是什么?

由于 ES5 不支持Function#name. 我正在寻找一种方法来模拟该功能。虽然很多人推荐使用Function#toString,但其他人强烈建议不要使用。


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


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 不支持箭头函数,我真的不知道风险在哪里。


蛊毒传说
浏览 142回答 1
1回答

慕村9548890

正如ECMAScript 5.1 规范所说,该toString方法返回一个具有FunctionDeclaration语法的字符串:函数.prototype.toString ()返回函数的依赖于实现的表示。此表示具有FunctionDeclaration的语法。请特别注意,表示字符串中空格、行终止符和分号的使用和放置取决于实现。该toString功能不是通用的;如果它的this值不是一个 Function 对象,它会抛出一个TypeError异常。因此,它不能转移到其他类型的对象作为方法使用。FunctionDeclaration具有以下语法:函数声明:函数 标识符 ( FormalParameterList opt ){ FunctionBody }正式参数列表:标识符FormalParameterList , 标识符和标识定义如下:标识符::IdentifierName 但不是 ReservedWord标识符名称::IdentifierStartIdentifierName IdentifierPart标识符开始::UnicodeLetter$_\ UnicodeEscapeSequence标识符部分::IdentifierStartUnicodeCombiningMarkUnicodeDigitUnicodeConnectorPunctuation结论虽然它不是一个很好的获取函数名的方式(但在 ES5 中是唯一的方式),但如果你让它解析上面列出的所有可能性,它可以在 ES5 中安全地工作。但是 ES6 标准修改了 的规范.toString(),这意味着更多可能的语法,使得在其中使用这种方法是不安全的。因此,仅在 ES6 之前的版本中使用此方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript