说我有以下代码:
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在跟踪期间显示anonymous
而不是函数名称?
答案 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解释器f1
,f2
和f3
只是变量名称。请考虑以下代码:
var foo = function(a) {
return f2(a + 1);
};
var f1 = foo;
foo = "bar"
解释器因此FireBug无法知道函数名称是foo
,f1
还是完全不同的东西。对于解释器,它只是一个匿名函数。您可以使用如下命名函数重写代码:
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".