如果當前函數是有名函數,則返回其名字,如果是匿名函數則返回被賦值的函數變數名,如果是閉包中匿名函數則返回“anonymous”。
var getFnName = function(callee){ var _callee = callee.toString().replace(/[\s\?]*/g,""), comb = _callee.length >= 50 ? 50 :_callee.length; _callee = _callee.substring(0,comb); var name = _callee.match(/^function([^\(]+?)\(/); if(name && name[1]){ return name[1]; } var caller = callee.caller, _caller = caller.toString().replace(/[\s\?]*/g,""); var last = _caller.indexOf(_callee), str = _caller.substring(last-30,last); name = str.match(/var([^\=]+?)\=/); if(name && name[1]){ return name[1]; } return "anonymous" };
使用:在要調查的函數內部執行此函數,傳入一個參數,為arguments.callee。
function ee(){ //+++++++++++++++++++++++++++++++++ var fnname =getFnName(arguments.callee) //+++++++++++++++++++++++++++++++++ alert(fnname) }; ee();
<meta charset="utf-8"><pre> //有名函數(函數定義) function hasname (){ var aa = getFnName(arguments.callee) //+++++++++++++++++++++++++++++++++ alert(aa) } hasname(); //匿名函數(函數運算式) var noname = function(){ //+++++++++++++++++++++++++++++++++ var bb = getFnName(arguments.callee) //+++++++++++++++++++++++++++++++++ alert(bb) }; noname(); //閉包 (function(){ //+++++++++++++++++++++++++++++++++ var cc = getFnName(arguments.callee) //+++++++++++++++++++++++++++++++++ alert(cc) })(); </pre><p>
運行代碼