匿名和命名函数的疑问

时间:2011-07-06 15:17:34

标签: javascript function anonymous-function

调试时我发现了这种功能:

var f = function() {};

anonymous的形式出现在firebug或webkits dev控制台的堆栈跟踪上,这是理所当然的。

我也看到有人将这些定义为:

var someName = function otherName(){};

这很奇怪。请注意,您无法在{strong>的任何地方拨打otherName(),但本身otherName的正文。在其他任何地方,您都必须使用someName()

我的问题是:

  • 命名一个与var存储的函数不同的函数有什么问题吗?

  • 除了在堆栈跟踪中显示名称外,var a = function a(){}是否有任何区别?

  • 关于此主题的任何其他提示/建议:)

3 个答案:

答案 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(){}表单),可能在某些边缘情况下有用,我会主要考虑错误处理。