Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome如何找到函数调用堆栈,我可以直接在Puppeter中调用它吗?_Javascript_Google Chrome_Puppeteer - Fatal编程技术网

Javascript Chrome如何找到函数调用堆栈,我可以直接在Puppeter中调用它吗?

Javascript Chrome如何找到函数调用堆栈,我可以直接在Puppeter中调用它吗?,javascript,google-chrome,puppeteer,Javascript,Google Chrome,Puppeteer,我希望在正常编程中获得函数调用堆栈,而不是异常(不是new Error().stack) 例如,我已经知道当点击标签时会调用函数f,而f的源代码如下: function f () { ... f1 (); // f1 is a custom function in another JavaScript file ... } 现在我有了f句柄和f1的名称,我可以通过调用chrome或puppeter中的一些函数来获取f1在哪个文件中

我希望在正常编程中获得函数调用堆栈,而不是异常(不是new Error().stack)

例如,我已经知道当点击标签时会调用函数f,而f的源代码如下:

    function f () {
        ...
        f1 (); // f1 is a custom function in another JavaScript file
        ...
    }

现在我有了f句柄和f1的名称,我可以通过调用chrome或puppeter中的一些函数来获取f1在哪个文件中,并获得它的行数吗?

没有办法抓住浏览器直接使用的正常堆栈(至少没有标准方法,我也从来没有努力过)。这通常位于原生处理部分的内脏内。最接近的方法是
newerror().stack
,您已经提到您不喜欢它

向每个函数添加内容的唯一其他方法是将其自身附加到您维护的堆栈中

您可以通过创建某种包装函数来实现这一点,如下所示:

const stack = []; // somewhere in the global space

const wrapInStackReporter = realFunc => function () {
    stack.push({ func: realFunc, name: realFunc.name, arguments });
    realFunc.apply(this, arguments);
    stack.pop();
};
然后你可以像这样使用它:

const someFunc = wrapInStackReporter(() => console.log('doing something'));
然后在全局空间中有
堆栈
,它将跟踪正在发生的事情

您可以更进一步,通过让它递归地循环它可以找到的所有函数(从全局空间开始,然后再从全局空间开始),自动化包装,这样您就不必手动包装每个函数:

const wrapAll = (target) => {
    Object.keys(target).forEach(key => {
      if (typeof target[key] == "object" && !(target[key] instanceof Function)) {
        wrapAll(target[key]);
      } else if(target[key] instanceof Function) {
        target[key] = wrapInStackReporter(target[key]);
      }
    });
};

wrapAll(window || global); // window for browsers, global for Node

上面的代码应该很接近,但可能没有考虑到您将遇到的所有可能的奇怪情况,但它给了您一个大致的想法。你必须小心引起副作用和奇怪的情况(特别是如果你使用自动换行方法)。

你能重新表述你的问题吗?据我所知,他基本上需要一段时间才能访问堆栈跟踪,你可以手动浏览。谢谢你的回答。我找到了两种获取调用堆栈的方法:(1)在Chrome控制台()中使用
console.trace()
,我仍在寻找获取输出的方法。(2) 在函数中使用
参数.callee.caller