gpt4 book ai didi

javascript - 使用 toString 获取函数名称有什么风险?

转载 作者:行者123 更新时间:2023-11-29 15:07:37 25 4
gpt4 key购买 nike

因为 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 不支持 arrow functions ,我真的不知道什么时候风险在哪里。

最佳答案

作为ECMAScript 5.1 specification表示,toString 方法返回一个语法为 FunctionDeclaration 的字符串:

Function.prototype.toString ( )

An implementation-dependent representation of the function is returned. This representation has the syntax of a FunctionDeclaration. Note in particular that the use and placement of white space, line terminators, and semicolons within the representation String is implementation-dependent.

The toString function is not generic; it throws a TypeError exception if its this value is not a Function object. Therefore, it cannot be transferred to other kinds of objects for use as a method.

FunctionDeclaration 具有以下语法:

FunctionDeclaration :

function Identifier ( FormalParameterListopt ) { FunctionBody }

FormalParameterList :

Identifier
FormalParameterList , Identifier

Identifier定义如下:

Identifier ::

IdentifierName but not ReservedWord

IdentifierName ::

IdentifierStart
IdentifierName IdentifierPart

IdentifierStart ::

UnicodeLetter
$
_
\ UnicodeEscapeSequence

IdentifierPart ::

IdentifierStart
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation

结论

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

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

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

关于javascript - 使用 toString 获取函数名称有什么风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58352293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com