我试图找出调用我的 Google Apps 脚本函数的函数的名称,方法是使用arguments.callee.caller
如何在 JavaScript 中找出调用者函数?,但似乎没有导出此类属性。(但是,arguments.callee
存在。)
如何在 Google Apps 脚本中获取该调用函数的名称?
作为次要问题,为什么不arguments.callee.caller
存在?
我试图找出调用我的 Google Apps 脚本函数的函数的名称,方法是使用arguments.callee.caller
如何在 JavaScript 中找出调用者函数?,但似乎没有导出此类属性。(但是,arguments.callee
存在。)
如何在 Google Apps 脚本中获取该调用函数的名称?
作为次要问题,为什么不arguments.callee.caller
存在?
我做了这个功能:
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;
}
}
它作为 Error() 抛出,然后从堆栈跟踪中获取函数名称。使用包装器时,尝试改变 matchArr[2] 中的“2”。
caller 是 JavaScript 的非标准扩展(也就是说,许多浏览器都有它,但它不是 EcmaScript 标准的一部分)并且没有在 Apps 脚本中实现。
这是我对其他两个建议解决方案的更新版本:
const getStacktrace = () => {
try {
throw new Error('')
} catch (exception) {
// example: at getStacktrace (helper:6:11)
const regex = /\sat (.+?) \((.+?):(\d+):(\d+)\)/
return exception
.stack
.split('\n')
.slice(1, -1)
.filter((frame, index) => {
return frame && index > 0
})
.map((frame) => {
const parts = frame.match(regex)
return {
function: parts[1],
file: parts[2],
line: parseInt(parts[3]),
column: parseInt(parts[4])
}
})
}
}
PS:请不要因为正则表达式发生了变化,而且我们忽略了堆栈跟踪的第一个元素,因为它是 getStacktrace 函数本身。
我根据 jgrotius 的回答做了一个函数来获取调用堆栈:
function getCallStack()
{
var returnValue = "";
var framePattern = /\sat (.+?):(\d+) \((.+?)\)/;
try
{
throw new Error('');
}
catch (e)
{
returnValue = e.stack
.split('\n')
.filter(function(frame, index) {
return !frame.isBlank() && index > 0;
})
// at app/lib/debug:21 (getCaller)
.map(function(frame) {
var parts = frame.match(framePattern);
return {
file: parts[1],
line: parseInt(parts[2]),
func: parts[3]
};
});
}
return returnValue;
}