调试时我发现了这种功能:
var f = function() {};
以anonymous
的形式出现在firebug或webkits dev控制台的堆栈跟踪上,这是理所当然的。
我也看到有人将这些定义为:
var someName = function otherName(){};
这很奇怪。请注意,您无法在{strong>的任何地方拨打otherName()
,但本身otherName
的正文。在其他任何地方,您都必须使用someName()
。
我的问题是:
命名一个与var存储的函数不同的函数有什么问题吗?
除了在堆栈跟踪中显示名称外,var a = function a(){}
是否有任何区别?
关于此主题的任何其他提示/建议:)
答案 0 :(得分:3)
将名为 f 的函数分配给名为 a 的变量没有问题。
关于函数的一个很好的参考是https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope。特别感兴趣的是题为“函数构造函数与函数声明与函数表达式”的部分,其中详细讨论了函数名称与函数赋值变量之间的区别。 (你可能已经看过了。)
我的猜测是调试器打印类似
的原因var a = function a() {}
是函数值本身被序列化时出现的函数名称。调试器会为您提供所有信息。
答案 1 :(得分:1)
请注意,在这里你不能从otherName本身的任何地方调用otherName()。
不在IE(包括IE8)中。
有关更多命名函数错误,请参阅http://kangax.github.com/nfe/#jscript-bugs,非常好的文章。
答案 2 :(得分:0)
不是真的。使用var a = function b() {}
时,指定的函数不会被提升,其原型也无法进行有意义的修改。以下面的代码为例:
function foo() {
}
foo.prototype.bar = "hi";
var a = new foo(); // this inherits from function foo() above
var b = function foo() {}; // this has nothing to do with the above
console.log(a.bar); // returns "hi" due to inheritance
console.log(b.bar); // returns undefined; its prototype is a new named
// function
var c = function() {};
var d = function d() {};
console.log(c.name); // returns ""
console.log(d.name); // returns "d"
AFAICT,主要有用的方法是让name
易于访问(主要针对var a = function a(){}
表单),可能在某些边缘情况下有用,我会主要考虑错误处理。