2011-04-08 50 views
2

我有一個名爲getItem的函數。我想用它內部的代碼讀取這個函數的名字。這可能嗎?javascript函數是否知道它的名字

function getItem(){ 
    var functionName = //how do I read the function name; 
    alert(functionName) //outputs 'getItem' 
} 
+1

誰說一個函數甚至必須有一個名字?畢竟,javascript對非命名函數有很大的支持。 – 2011-04-08 18:51:24

+0

@Joel Coehoorn,我知道你的意思,但是這個功能有一個名字,因爲我確保給它一個。有沒有辦法從函數內部獲取該名稱? – jarn 2011-04-08 18:52:49

+1

你想解決什麼問題?你在編寫測試框架並將這些代碼注入其他函數嗎?可能有辦法解決您的問題,而不需要函數的名稱。 – 2011-04-08 18:56:55

回答

3

試試這個:

function getItem(){ 
    var functionName = arguments.callee.name; 
    alert(functionName) //outputs 'getItem' 
} 

這裏是小提琴:http://jsfiddle.net/maniator/xGzKA/

也看到這個previous stack Q另一種解決方案

+0

arguments.callee在嚴格的JS中被棄用,就像一個注意事項。 – 2011-04-08 18:55:55

+0

在IE8中不起作用,警告'未定義' – 2011-04-08 19:03:14

+0

@Shadow Wizard,在IE中你必須使用另一個堆棧Q – Neal 2011-04-08 19:04:01

-1

試試這個,

function getItem(){ 
    var functionName = arguments.callee.name; 
    alert(functionName); 
} 

http://jsfiddle.net/XPGxE/

+0

大聲笑模仿:-P – Neal 2011-04-08 18:56:23

+0

請參閱http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript – KooiInc 2011-04-08 18:57:53

+0

@尼爾Didnt意思是複製。我和你幾乎同時發佈了相同的答案。只有在發佈後才能看到您的答案。 – 2011-04-08 19:14:58

0

雖然你可能不應該使用這個,你可以對IE,火狐,Chrome,Safari和Opera做到這一點(我承認arguments.callee方便儘管有效保留意見吧,如果該功能將arguments.callee.name .name屬性是標準的):

function getFuncName (fn) { 
    var name = (/\W*function\s+([\w\$]+)\s*\(/).exec(fn); 
    return name ? name[1] : '(Anonymous)'; 
} 
相關問題