我正试图通过使用arguments.callee.caller
来查找调用我的Google Apps Script函数的函数的名称,如"如何在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 Script中实现。
我根据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;
}
这是我提出的另外两个解决方案的更新版本:
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])
}
})
}
}
附言:请注意,regex已经更改,而且我们忽略了stacktrace的第一个元素,因为它是getStacktrace函数本身。