以jQuery框架为例,如果你运行这样的代码:

$(document).ready(function init() { foo.bar(); });

您在Firebug中获得的堆栈跟踪将如下所示:

init()
anonymous()
anonymous([function(), init(), function(), 4 more...], function(), Object name=args)
anonymous()
anonymous()

正如您所看到的,它不是非常易读,因为您必须单击每个功能才能找出它是什么。匿名函数也会在探查器中显示为(?)(),它们可以导致“无法访问优化的闭包”错误。在我看来,这些是避免它们的充分理由。然后就是ECMAScript 5将在其严格模式下弃用 arguments.callee 这一事实,这意味着无法使用它来引用匿名函数,这使得它们在未来的证据不足。

另一方面,使用命名函数可能导致重复,例如:

var Foo = {
    bar: function bar() {}
}

function Foo() {}

Foo.prototype.bar = function bar() {}

根据命名函数提供的调试方便,我认为这种重复是正确的,并且jQuery这样的良好框架中匿名函数的普遍存在是一种疏忽吗?

有帮助吗?

解决方案 2

我在非常翔实的文章中找到了我的问题的答案。首先,事实证明我认为命名函数更合适是正确的,但解决方案并不像向所有匿名函数添加标识符那么简单。主要原因是JScript以非常破碎的方式实现了函数表达式。

其次,函数语句和表达式之间存在区别。匿名函数只是一个省略了标识符的函数表达式,添加一个标识符(命名它)不会使它成为一个语句(JScript除外,这就是它被破坏的原因)。这意味着所有其他答案都不合适。

其他提示

我同意在JavaScript / EMCAScript中使用匿名方法有一些缺点。但是,不要忽视它们应该如何使用。对于想要传递给另一个函数的简单的一个衬垫,它们通常很棒。

但对我来说,匿名函数在源代码中更具可读性,因为我确信它们只在那里使用。

匿名功能非常方便。更好地解决这个问题,而不是命名函数,如果firebug告诉你在哪个文件中创建了匿名函数。

init()
anonymous() // application.js, line 54
anonymous() // foo.js, line 2

堆栈跟踪是匿名函数成为问题的唯一地方。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top