4

我试图找出调用我的 Google Apps 脚本函数的函数的名称,方法是使用arguments.callee.caller如何在 JavaScript 中找出调用者函数?,但似乎没有导出此类属性。(但是,arguments.callee存在。)

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

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

4

4 回答 4

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() 抛出,然后从堆栈跟踪中获取函数名称。使用包装器时,尝试改变 matchArr[2] 中的“2”。

于 2016-03-08T18:15:59.073 回答
1

caller 是 JavaScript 的非标准扩展(也就是说,许多浏览器都有它,但它不是 EcmaScript 标准的一部分)并且没有在 Apps 脚本中实现。

于 2013-02-06T13:32:02.083 回答
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])
        }
    })
  }
}

PS:请不要因为正则表达式发生了变化,而且我们忽略了堆栈跟踪的第一个元素,因为它是 getStacktrace 函数本身。

于 2021-03-14T16:10:01.997 回答
0

我根据 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;
  }  
于 2020-02-08T17:50:44.840 回答