代码之家  ›  专栏  ›  技术社区  ›  Andreas Grech

为什么firebug的console.trace在跟踪过程中将“anonymous”报告为函数名?

  •  1
  • Andreas Grech  · 技术社区  · 16 年前

    假设我有以下代码:

    var f1 = function (a) {
        return f2(a + 1);
    };
    var f2 = function (a) {
        return f3(a + 1);
    }
    var f3 = function (a) {
        console.trace();
    };
    
    f1(5);
    

    我正在做一个 console.trace 在里面 f3 这就是控制台显示的内容:

    Firebug trace http://img140.imageshack.us/img140/2337/fbtrace.png


    我的问题是,为什么萤火虫会出现 anonymous 而不是跟踪过程中的函数名?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Mark Byers    16 年前

    像这样重写它来命名函数,而不是使用匿名函数:

    function f1(a) {
        return f2(a + 1);
    };
    function f2(a) {
        return f3(a + 1);
    }
    function f3(a) {
        console.trace();
    };
    
    f1(5);
    

    this page 为了更好地描述这两种语法之间的差异。

        2
  •  2
  •   Fabien Ménager    16 年前
    function f1(a) {
        return f2(a + 1);
    };
    function f2(a) {
        return f3(a + 1);
    }
    function f3(a) {
        console.trace();
    };
    
    f1(5);
    

    将显示函数名。硒 here 更多信息。

        3
  •  1
  •   Fabian Jakobs    16 年前

    您的函数是匿名函数。对于javascript解释器 f1 , f2 f3 只是变量名。请考虑以下代码:

    var foo = function(a) {
        return f2(a + 1);
    };
    var f1 = foo;
    foo = "bar"
    

    intepreter和firebug无法知道函数名是否为 foo , F1 或者完全不同的东西。对于解释器来说,它只是一个匿名函数。您可以使用如下命名函数重写代码:

    function f1(a) {
        return f2(a + 1);
    };
    

    甚至可以将命名函数赋给变量:

    var f1 = function f1(a) {
        return f2(a + 1);
    };
    

    在这种情况下,函数名将始终为 F1 不考虑变量的名称。

    WebKit和Chrome Inspector的新版本支持 displayName 函数的属性 1 . 如果匿名函数具有这样的属性,则该属性的值将用作函数名。在代码中,您可以编写:

    var f1 = function(a) {
        return f2(a + 1);
    };
    f.displayName = "f1".