2014-01-22 68 views
3

匿名變量的名字,我具備的功能獲取包含函數

function getCallingFunctionName() { 
    alert(arguments.callee.caller.name.toString(); 
} 

var bob = function() { 
    ... 
    getCallingFunctionName(); 
} 

當代碼運行驚動值則返回一個空字符串。我需要返回

bob 

我不能改變原有功能(IM處理大項目與成千上萬的功能等

var bob = function bob() { 
    ... 
    getCallingFunctionName(); 
} 

任何一個有任何其他的想法?它不是關鍵的有,但基本上以幫助調試

+4

如果一個匿名函數有一個名字,它是不是匿名的呢? –

+1

我不完全確定你想要解決什麼問題。但是如果你需要一個標識符,你不能簡單地添加一個標識函數名稱的局部變量嗎? –

+0

'arguments.callee.caller'已棄用。看到這個:http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript/235760#235760 –

回答

1

如果你嘗試做這樣的事情:

function getCallingFunctionName() { 
    try { 
     throw new Error(); 
    } 
    catch(e) { 
     console.log(e); 
    } 
} 

var bob = function() { 
    getCallingFunctionName(); 
} 

它會給你這樣的東西:

Error 
    at getCallingFunctionName (<anonymous>:4:15) 
    at bob (<anonymous>:12:5) 
    at <anonymous>:2:1 
    at Object.InjectedScript._evaluateOn (<anonymous>:581:39) 
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52) 
    at Object.InjectedScript.evaluate (<anonymous>:459:21) 

你可以用它來爲你的目的,即提取函數名稱。唯一可悲的是,IE支持Error.stack從10版

0

這裏開始是一個辦法,那需要一點點額外的努力/代碼,但也許它適合你:

var cache = {}; 

var bob = function() { 
    getCallingFunctionName(); 
} 

function getCallingFunctionName() { 
    alert(cache[arguments.callee.caller.toString()]); 
} 

cache[bob.toString()] = "bob"; 

bob(); //bob 

所以你基本上是緩存函數字符串表示(它是完整的函數體)並將其用作實際函數名稱的關鍵字。之後您可以訪問該名稱,只能再次使用func.toString()。當然,這要求你沒有兩個功能完全相同的主體。