2012-12-07 141 views
1

爲了得到一個函數名稱的函數中我可以使用此代碼:功能函數內部函數名稱?

function getmyname() { 
    var myName = arguments.callee.toString(); 
    myName = myName.substr('function '.length); 
    myName = myName.substr(0, myName.indexOf('(')); 
    alert(myName); // getmyname 
} 

但我需要運行這個很多次,所以我寧願使用,做它的功能,所以它看起來如:

function getmyname() { 
    alert(getfname()); // getmyname 
} 

因此getfname()會得到名稱。如何才能做到這一點?

+0

閱讀此:[爲什麼在JavaScript中arguments.callee.caller屬性不推薦](http://stackoverflow.com/a/235760/14104) – epascarello

+0

也許值得問自己,如果你真的需要這樣做。 –

+0

'getfname()'會對名稱做什麼?只需返回它?如果是這樣,爲什麼你不只是首先引用這個名字? –

回答

1

您可以通過本地參數getmyname功能和使用callee.name代替解析:

function getmyname(args) { 
    return args.callee.name; 
} 

function getname() { 
    alert(getmyname(arguments)); 
} 

getname(); // "getname" 
+0

值得指出的是,由於不需要解析OP的代碼,所以實際上不需要單獨的'getmyname'函數 - 只需使用'alert(args.callee.name)' – Stuart

+0

@Stuart是的,'' alert(arguments.callee.name)'確切地說。不過,我只是按照OP的問題。 – VisioN

+0

謝謝你的澄清,我不知道你可以使用它。答案是對的。 – lisovaccaro

0

.name是屬性功能對象自己。

function getmyname() { 
    return arguments.callee.name; 
} 

function getname() { 
    alert(getmyname()); 
} 

getname(); // alerts "getmyname" 

小心的詞:

arguments.callee的與其他性能,是在 ECMAscript5嚴格模式陳舊和訪問時會引發錯誤。因此,我們 需要返回getmyname.name,這顯然不是真的 優雅的,因爲我們可以直接返回字符串