为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蛊毒传说 2021-11-18 15:57:44
由于 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 不支持箭头函数,我真的不知道风险在哪里。
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

正如ECMAScript 5.1 规范所说,该toString方法返回一个具有FunctionDeclaration语法的字符串:

函数.prototype.toString ()

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

toString功能不是通用的;如果它的this值不是一个 Function 对象,它会抛出一个TypeError异常。因此,它不能转移到其他类型的对象作为方法使用。

FunctionDeclaration具有以下语法:

函数声明

函数 标识符  FormalParameterList opt ){ FunctionBody }

正式参数列表

标识符
FormalParameterList , 标识符

标识定义如下:

标识符::

IdentifierName 但不是 ReservedWord

标识符名称::

IdentifierStart
IdentifierName IdentifierPart

标识符开始::

UnicodeLetter
$
_
UnicodeEscapeSequence

标识符部分::

IdentifierStart
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation

结论

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

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

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


查看完整回答
反对 回复 2021-11-18
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信