Javascript 使用toString获取函数名有什么风险?
因为ES5不支持。我正在寻找一种方法来模拟这种功能。虽然很多人建议使用,但也有人强烈反对 那么,使用下面的代码获取函数名有什么风险呢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() {
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您的代码现在是可以的;但根据