亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號