2016-03-08 122 views
7

是否可以獲取如下聲明的匿名函數的名稱?是否有可能獲得匿名JavaScript函數的名稱?

var F = function(){}; 

乍一看,答案是否定的,但顯然瀏覽器認識和把握函數名稱:

var F = function(){}; 
var x = new F(); 
console.log(x.constructor); // function F() 

(火狐)

var F = function(){}; 
var x = new F(); 
console.log(x); // F {} 

器(Chrome)

這個名字可以通過某種方式訪問​​嗎?我主要需要它來進行錯誤日誌記錄,因此該解決方案不必跨瀏覽器。

編輯澄清:

我得到來自外部的代碼的對象,我需要知道它們的類型,因此,很顯然答案像使用其他方式申報是不是我在尋找。

+0

我遇到了類似的錯誤日誌記錄問題,在'Error.stack'瀏覽器中會包含這個令牌的名字,你可以用這個。 – Halcyon

+1

看看這裏http://stackoverflow.com/問題/ 332422 /我如何得到一個對象的名稱在JavaScript中的類型 – Ronnie

+2

可能重複的[獲取匿名函數名稱](http://stackoverflow.com/questions/14178305/ get-anonymous-function-name) – whd

回答

2

在您嘗試使用的用例中,可能有多個變量擁有相同的匿名函數。

即它可以繼續這樣的:

var F = function(){}; 
var x = new F(); 
var x2 = x; 
var x3 = x; 
var blah = x3; 

所以,現在我們必須尋找一個以上的名稱。我想到的第一件事是循環瀏覽窗口下的所有對象,並打印出與該值具有相同方法的名稱。

所以,你覺得是這樣的:

for each (item in window){ 
    if (myfunc == item){ 
     console.log(/*Somehow print the actual name of the item */) 
    } 
} 

但是,它不工作,這樣以來,現在item是另一個變量,看起來就像沒有內置屬性,讓變量名稱。 可能是,看看Variable name as a string in Javascript,不是說它在這裏幫助,雖然...

所以,最後,因爲你提到你試圖做錯誤日誌記錄,想到使用堆棧跟蹤。不知道它會在你申請的情況,可能還是有點啓發:)

這是怎麼一回事呢: (被警告,這是一個黑客)

var myFunction = function(){ 
    var err = new Error(); 
    console.log(err.stack) 
} 
myFunction(); 

會輸出類似:

[email protected] eval code:3:17 
@debugger eval code:6:5 
@debugger eval code:1:15 

而且,採取這一到一個新的水平:

var myFunction = function(){ 
    var err = new Error(); 
    console.log(err.stack.split("@")[0]) 
/* split the stack-trace string and get the first word before @ */ 
} 
myFunction(); 

現在,其輸出將是:

myFunction 

其中,確實是持有匿名函數的變量的名稱。

注:此答案由提問How can I get a Javascript stack trace when I throw an exception?

只是Firefox是否嘗試過這種風格,還有的堆棧跟蹤可能會有所不同別處的機會。

編輯: 沒有注意到你的編輯,這可能需要聲明的編輯,打破你的使用情況。 :(

相關問題