在JavaScript中被命名的函数被低估了吗?
-
06-07-2019 - |
题
以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
堆栈跟踪是匿名函数成为问题的唯一地方。
不隶属于 StackOverflow