我正在尝试使用How do you find out the caller function in JavaScript?中的arguments.callee.caller
来查找调用我的Google Apps脚本功能的函数的名称,但似乎没有导出此类属性。 (但是,arguments.callee
存在。)
如何在Google Apps脚本中获取该调用函数的名称?
作为次要问题,为什么arguments.callee.caller
不存在?
答案 0 :(得分:4)
我做了这个功能:
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()然后从堆栈跟踪中获取函数名称。 尝试改变' 2'在matchArr [2]中使用包装器。
答案 1 :(得分:1)
调用者是JavaScript的非标准扩展(也就是说,许多浏览器都有它,但它不是EcmaScript标准的一部分),并且未在Apps脚本中实现。
答案 2 :(得分:0)
我制作了一个函数,用于基于jgrotius的答案获取调用堆栈:
$em = $this->getDoctrine()->getManager();
$entity = new PointData();
$em->persist($entity);
$entity->getId() <-- return <int>
$em->flush();
答案 3 :(得分:0)
这是我对其他两个建议解决方案的更新版本:
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])
}
})
}
}
P.S.:请不要说正则表达式已经改变,我们也忽略了堆栈跟踪的第一个元素,因为它是 getStacktrace 函数本身。