为什么Firebug的console.trace在跟踪期间报告'anonymous'作为函数名称?

时间:2010-01-02 10:49:18

标签: javascript firebug

说我有以下代码:

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


我的问题是,为什么Firebug在跟踪期间显示anonymous而不是函数名称?

3 个答案:

答案 0 :(得分:3)

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

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

f1(5);

有关两种语法之间差异的详细说明,请参阅this page

答案 1 :(得分:2)

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

f1(5);

将显示功能名称。 Se here了解更多信息。

答案 2 :(得分:1)

您的功能是匿名功能。对于JavaScript解释器f1f2f3只是变量名称。请考虑以下代码:

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

解释器因此FireBug无法知道函数名称是foof1还是完全不同的东西。对于解释器,它只是一个匿名函数。您可以使用如下命名函数重写代码:

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

您甚至可以将命名函数分配给变量:

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

在这种情况下,无论变量名称如何,函数名称始终为f1

WebKit和Chrome Inspector的较新版本支持函数1上的displayName属性。如果匿名函数具有此类属性,则该属性的值将用作函数名称。在您的代码中,您可以例如写:

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