Javascript 为什么Firebug的console.trace在跟踪期间报告“匿名”作为函数名?

Javascript 为什么Firebug的console.trace在跟踪期间报告“匿名”作为函数名?,javascript,firebug,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); var foo = function(a) { return f2(a + 1); }; var f1 = foo; foo = "bar" 我正在f3中执行co

假设我有以下代码:

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

f1(5);
var foo = function(a) {
    return f2(a + 1);
};
var f1 = foo;
foo = "bar"
我正在f3中执行console.trace,这是控制台显示的内容:


我的问题是,为什么Firebug在跟踪过程中显示匿名而不是函数名?

将其改写为这样,以命名函数而不是使用匿名函数:

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

f1(5);

有关这两种语法之间差异的详细说明,请参见。

将其改写为函数名称,而不是使用匿名函数:

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

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

f1(5);
有关这两种语法之间差异的详细描述,请参见

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

f1(5);
将显示函数名。如需更多信息,请访问Se


将显示函数名。Se以获取更多信息。

您的函数是匿名函数。对于JavaScript解释器,f1、f2和f3只是变量名。考虑下面的代码:

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

f1(5);
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属性。如果匿名函数具有此类属性,则该属性的值将用作函数名。在您的代码中,您可以编写:

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

您的函数是匿名函数。对于JavaScript解释器,f1、f2和f3只是变量名。考虑下面的代码:

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

f1(5);
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属性。如果匿名函数具有此类属性,则该属性的值将用作函数名。在您的代码中,您可以编写:

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

那些没有函数名。这些是匿名函数,您恰好将其分配给变量名。你可以有多个变量指向同一个匿名函数,Firebug会怎么做?哦,现在我明白了。事实上,如果不是创建函数并将其赋值给变量,而是使用函数f1{有效!@Eric Muyser:你可能应该把它作为一个答案提交。你显然是写答案最快的人,但他不能接受一条评论作为正确答案。那些没有函数名。那些是匿名函数,你碰巧分配给变量名。你可以有多个变量指向same匿名函数,Firebug会怎么做?哦,现在我明白了。事实上,如果我不创建函数并将其分配给变量,而是使用函数f1{它可以工作!@Eric Muyser:你可能应该提交它作为答案。你显然是写答案最快的人,但他不能接受一条评论作为正确答案。