代码之家  ›  专栏  ›  技术社区  ›  rosscj2533

调试javascript时,是否有方法提醒当前调用堆栈?

  •  21
  • rosscj2533  · 技术社区  · 15 年前

    对于简单的JavaScript调试,我将使用警报来显示变量值等。有没有一种方法可以让当前的调用堆栈在javascript中显示在警报中?

    谢谢。

    7 回复  |  直到 8 年前
        1
  •  39
  •   Jeff Walden    14 年前

    在基于Gecko的浏览器中快速和肮脏:

    new Error().stack
    

    您还可以使用function.prototype.caller手动拖网一些堆栈:

    var thisFunction = arguments.callee;
    var caller = thisFunction.caller;
    var callerCaller = caller.caller;
    // ...and eventually, assuming no recursion:
    var bottomCaller = ...;
    assert(bottomCaller.caller === null);
    

    .caller技巧的一个(可能很大)警告是它不处理递归-- .caller 从堆栈的顶部向下查找,以在堆栈中找到函数的第一个实例,然后返回其直接调用方,因此,在不小心的情况下,可以无限循环查找调用方。

    另一个警告 caller 如果您的任何代码使用ECMAScript 5的严格模式, 呼叫者 严格模式函数(或从严格模式函数中调用自己的函数)的属性是一个所谓的“毒丸”,它抛出一个 TypeError 访问时。这个 呼叫者 “绑定”函数的属性(由ES5创建的 Function.prototype.bind 方法)也是一种毒丸。这些限制打破了一般的堆栈遍历算法,尽管可以想象使用特定的方法来解决这个问题(可能是入口和出口注释函数)。

    请注意,这样的堆栈遍历在生产代码中并不是一个好主意(作为调试的快速黑客,tho);现在,像后面的例子一样,在Mozilla的JS引擎中,向上遍历堆栈有点昂贵,它可能会将您从机器代码中抛出,并返回到解释代码中。另外,堆栈遍历为O(N 如果你有复杂的,很深的堆栈,这可能很重要。

        2
  •  23
  •   jimasun    8 年前

    在firefox+firebug和webkit上,您可以使用 console.trace()

    它不显示 alert() 但是打印 stacktrace 在控制台上。

        3
  •  6
  •   Ivan Nevostruev    15 年前

    使用类似调试器 Firebug 如果你在火狐中的话。Chrome和Opera有内置的调试器。还有 Developers Tools 对于Internet Explorer。

        4
  •  3
  •   SLaks    15 年前

    调试JavaScript的最佳方法是使用 Firebug 包括一个完整的javascript调试器。

    如果在IE中进行调试,可以使用 Visual Web Developer Express (或任何其他版本的Visual Studio)。
    如果您正在调试IE8,则可以使用其内置的开发人员工具,其中包括调试器。

    可以用javascript获取调用堆栈;请参见 here .

        5
  •  3
  •   phatmanace    15 年前

    你看过Firebug和断点吗?如果只是为了调试,那么这就足够了。

    还有-你可以看看 Here

        6
  •  1
  •   zvi    10 年前

    这将给您所有的调用堆栈 对我有好处。

    var y = 'arguments.callee.caller';
        while (eval(y) != undefined) {
            stak += eval(y + '.toString()');
            y = y + '.caller';
        }
        alert(stak);
    
        7
  •  0
  •   ptrk    8 年前

    对于nodejs调试,在Visual Studio代码中,从v.1.14.2开始,它是view->debug(ctrl+shift+d)