2011-12-11 42 views
3

我需要從一個函數中獲取它的名字(實際上我用.caller稍微上了一層,但不應該改變問題)。從var定義的函數中獲取名字

'arguments.callee.name'將解決我的問題,如果我的功能已被命名。但我的函數聲明爲var myFunc = function(){},並且改變這是不可能的(我使用總是編譯爲var聲明的CoffeeScript)。

那麼我怎樣才能得到該函數分配的變量?

這是爲了調試目的,所以我不擔心性能,我會使用任何操作讓我的名字,無論處理/時間成本。

編輯:根據記錄,這是我在CoffeeScript中實現了基於所選答案的建議庫:

window.log = (msg) -> 
    caller = printStackTrace()[4] 
    caller = caller.substring 0, caller.indexOf('(') - 1 
    if typeof msg is 'object' 
    console.log "v --- at #{ caller }: ---" 
    console.log msg 
    else console.log "> --- at #{ caller }: " + msg 

工程就像一個魅力,謝謝大家!

+2

就在調用點之前對代碼進行分析的缺點我不認爲這是可能的。 –

+0

那麼,這些函數沒有名稱,這就是爲什麼他們被稱爲「匿名函數」。 –

+0

現代瀏覽器JS調試器做到這一點(比較堆棧跟蹤與Chrome中的匿名函數來說IE7),但他們有更多的上下文可以離開。 –

回答

2

您可能感興趣的this javascript stacktrace project on github。請特別注意stacktrace.js中的findFunctionName方法。

基本上,他們使用XMLHTTPRequest重新獲取javascript源代碼,並在聲明該函數的地方拖出一行。

+0

謝謝!不過,我很難看到如何在產生錯誤的情況之外使用它。我怎麼能簡單地在我定義的函數中使用findFunctionName這樣的方法(例如日誌記錄功能)? –

+0

你可以產生一個錯誤(當然可以立即捕獲它)。 –

1

如果您使用Google Chrome,則可以使用堆棧跟蹤API來獲取該信息。請參閱:http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi

+0

但是我怎麼能直接使用這個提到的CallSite API來從該函數本身中獲取上下文推斷的函數名?引用:「結構化堆棧跟蹤是一個CallSite對象數組,每個對象表示一個堆棧幀。一個CallSite對象定義了以下方法:(..)」 –