如何获取arguments.callee.caller?

时间:2013-02-05 17:24:05

标签: google-apps-script

我正在尝试使用How do you find out the caller function in JavaScript?中的arguments.callee.caller来查找调用我的Google Apps脚本功能的函数的名称,但似乎没有导出此类属性。 (但是,arguments.callee存在。)

如何在Google Apps脚本中获取该调用函数的名称?

作为次要问题,为什么arguments.callee.caller不存在?

4 个答案:

答案 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 函数本身。