2013-02-05 29 views
1

我試圖通過使用arguments.callee.caller(如How do you find out the caller function in JavaScript?)來找到調用我的Google Apps腳本函數的函數的名稱,但似乎沒有導出這樣的屬性。 (但是,arguments.callee存在。)如何獲取arguments.callee.caller?

如何在Google Apps腳本中獲取該調用函數的名稱?

作爲第二個問題,爲什麼不在arguments.callee.caller那裏?

+0

這可以幫助嗎? http://stackoverflow.com/questions/10105526/google-apps-script-find-function-caller-id 我不知道你的目的是什麼 – bpoiss

+0

@bpoiss - 這個問題是處理不推薦的UiApp,而timchen是尋找類似JavaScript的堆棧跟蹤。不幸的是,這不是一回事。 – Mogsdad

回答

1

調用者是JavaScript的非標準擴展(也就是說,許多瀏覽器都擁有它,但它不是EcmaScript標準的一部分),並且未在Apps腳本中實現。

3

我做了這個功能:

function getCaller() 
{ 
    var stack; 
    var ret = ""; 
    try 
    { 
     throw new Error("Whoops!"); 
    } 
    catch (e) 
    { 
     stack = e.stack; 
    } 
    finally 
    { 
     var matchArr = stack.match(/\(.*\)/g); 
     if (matchArr.length > 2) 
     { 
     tmp = matchArr[2]; 
     ret = tmp.slice(1, tmp.length - 1) + "()"; 
     } 
     return ret; 
    } 
} 

它拋出的錯誤(),然後從堆棧跟蹤獲取函數名。 使用包裝時,嘗試改變matchArr [2]中的'2'。

+0

您可以通過一些示例代碼來顯示如何使用它,並通過記錄器輸出來說明結果。這種答案將與問題[像這樣](http://stackoverflow.com/questions/35855430/get-file-id-or-type-of-google-app-a-function-was-called -從)。 – Mogsdad

+0

聰明的解決方案。我調整它通過默認'ret'到一個空數組並返回整個調用鏈,並用下面的代替if中的邏輯:'ret = matchArr.slice(2).map(function(caller){return caller。 slice(1,caller.length - 1)+「()」});' –

+0

@Mogsdad調用建議的'getCaller()'函數將返回一個字符串,其中包含所謂的函數,例如,如果我有函數function test(){console.log(getCaller()); },調用這個函數會把'test()'的調用者記錄到控制檯。 –