Are anonymous functions a bad practice in JavaScript?
我读到在javascript中使用匿名函数是一种糟糕的实践,因为它会让调试变得很痛苦,但我自己还没有看到这一点。javascript中的匿名函数真的是糟糕的做法吗?如果是,为什么?
- 自2010年以来,开发人员工具和构建/模块策略取得了长足进展。chrome/webkit确实很好,firebug非常好,但是足够(命名函数表达式也有助于视觉效果)。不管怎样,考虑到它们的使用次数,这是一个……可疑的公理,可能与"太聪明"和难以跟踪/调试的代码有关。因为调试我的代码从来没有感到痛苦;-)
不,匿名函数在Web上的javascript中被广泛使用。这可能会使调试变得更加困难,但还不足以说明不应该使用它们。
例如,jquery广泛使用它们。
有很多时候,您希望在正式声明的函数上使用它们,例如当您希望限制它们的作用域时。
- 实际上,这是我停止使用jquery的原因之一。确定bug是我的代码中的语法错误、代码中的逻辑错误还是jquery本身的某些错误总是比我认为合理的时间长得多。你必须承认,匿名函数的调用堆栈并不像命名函数那样让事情一目了然。
- 可以始终使用命名函数表达式。
我将在这里稍微反对一下这个流程,并指出匿名函数实际上是一种不好的实践,尽管它们被广泛使用。
1)匿名函数不能重用。
2)根据定义,匿名函数没有名称,因此不描述它们的作用。也就是说代码不是自记录的。
3)匿名函数不能单独使用单元测试框架进行测试。
4)我个人认为它们使代码更难阅读和调试。尽管你的经验可能有所不同。
我认为在某些情况下,匿名函数是最好的选择,而且作为一般规则,为了避免上述缺点,我几乎总是给函数命名。
- 1)匿名函数和闭包可以重用,每个函数都是值,可以分配给变量或作为函数参数提供-这只是一个公开函数对象的问题,例如在正确的级别/范围内;2)匿名函数(或函数表达式)可以指定显式名称,但在上下文中是"匿名的";3)取决于测试的内容、测试的方式以及函数对象是如何暴露的;4)在"太聪明"的情况下,闭包/lambda可能会被滥用,但糟糕的编码人员是糟糕的编码人员,即使使用最简单的过程代码语句也是如此。
- 我对你在这里说的话感到困惑。如果你给一个函数一个名字,然后把它赋给一个变量,那么它不是通过定义而不是一个匿名函数吗?你能举个匿名名字的例子吗?
- 问题是,术语"匿名"函数是一个谎言。实数项应该是函数表达式或闭包,甚至是lambda(这不同于顶级的"函数语句"或"方法")。因为在没有名字的情况下,如何使用"匿名"函数(IIFE除外)?
- 我认为"匿名功能"这个词被社会所熟知。它是指一个未分配给变量的函数。
- 但这种宽泛的观点令人困惑,而且通常是错误的。考虑一下:[].forEach(function () {..})—这个函数有一个绑定到的名称。或者,同样地,这仍然是"匿名的"—var filter = function () { .. }?问题是"匿名"这个词不好用。
- 我不同意。在您的示例中,传递到名为foreach的函数的函数没有名称。
- 它确实有一个名称-上下文中参数绑定的名称。与[].forEach(doIt)相比,它在绑定站点上的"匿名"程度不高。
- 我同意在以后使用时为它指定一个名称,但在创建它的上下文中没有名称。正是在这样的背景下,我在上面列出的4点中创建了它。
相反,lambdas(别名)使一些表达式更简洁。例如,如果您将多个事件处理程序绑定到多个事件,那么为每个事件处理程序提供一个函数名就很麻烦了。
它比没有更有用,更节省时间,即使它使调试有点困难,但我很少在调试中挣扎,因为函数是匿名的。在编码时,您应该使用jslint来简化您的生活。
最肯定的是,lambda函数被广泛使用,几乎无所不在。
- 只是因为一些普通的事情并不意味着它是正确的。使用匿名函数可能没有什么错,但是说"每个人都这样做"并不构成有效的论点。
- 这里到处都是深藏的sass,但它完全是错误的。
仅仅因为每个人都使用它们并不能使它们成为良好的实践(每个人都记得使用table元素进行布局吗?)但是,它们很好,因为它们可以帮助您澄清和简化代码,减少出错的机会。
但是,匿名函数不应该如此复杂,以至于调试变得困难。在这种情况下,也许最好创建一个新的函数。
- 可以始终使用命名函数表达式。
- @Marcelkorpel:你提供的链接已经死了,但是我想你的意思是你可以选择在匿名函数中添加一个名字(使它不再匿名),比如:var fAnonymous = (function nonAnon(){ });。这当然有助于调试。
- @真的很无聊。据我所知,我链接到的文章现在在kangax的github.io网站上。
这是我的浏览器控制台:
1 2 3 4 5 6 7 8 9 10 11
| // Bad
poopy = function(){}
// function (){}
groupy = poopy;
// function (){}
// Good
droopy = function loopy(){};
// function loopy(){}
floupy = droopy;
// function loopy(){} |
假设您正在调试一些东西,并且您有一个名为groupy的函数名。你输入它的名字来获得更多的信息。如果该函数被设置为坏的部分,那么您不知道原始声明是什么。但是,如果像good部分那样定义函数名,那么您将始终跟踪原始函数名。
- 如果您在示例中使用描述其功能的标识符,而不是经典的foo和bar标识符,那么您的答案会更清楚。第三首押韵后,我的眼睛变得呆滞了。
匿名函数表达式是JavaScript中的最佳实践。
- 由于缺乏支持而被拒绝的索赔。
- 由于缺乏原因被否决。也因为一般的做法不一定是最佳做法。