匿名函数和命名函数存在疑问

anonymous and named functions doubt

本文关键字:函数 存在      更新时间:2023-09-26

在调试时,我发现这类函数:

var f = function() {};

anonymous的形式出现在firebug或webkit开发控制台的堆栈跟踪中,这是理所当然的

我也看到人们将其定义为:

var someName = function otherName(){};

这很奇怪。请注意,这里不能从任何地方调用otherName(),但是otherName本身的主体。在其他任何地方,您都必须使用someName()

我的问题是:

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

  • 除了在堆栈跟踪中显示名称之外,var a = function a(){}还有什么不同吗?

  • 关于这个主题的任何其他提示/建议:(

将名为f的函数分配给名为a的变量没有问题。

关于函数的一个很好的参考是https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope.特别感兴趣的是标题为"函数构造函数与函数声明与函数表达式"的部分,其中详细讨论了函数名称和函数分配给的变量之间的区别

我的猜测是调试器打印类似的东西的原因

var a = function a() {}

是在序列化函数值本身时显示函数的名称。调试器正在为您提供它所拥有的所有信息。

请注意,在这里,除了otherName本身的主体之外,您不能从任何地方调用otherName((。

不在IE中(包括IE8(。

请参阅http://kangax.github.com/nfe/#jscript-更多命名函数bug的bug,非常好的文章。

不是。使用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(){}形式(,在某些边缘情况下可能会有帮助,我认为主要是在错误处理中。