匿名函数在JavaScript中是一种糟糕的做法吗?

匿名函数在JavaScript中是一种糟糕的做法吗?,javascript,anonymous-function,Javascript,Anonymous Function,我读到在javascript中使用匿名函数是一种不好的做法,因为它会让调试变得很痛苦,但我自己还没有看到这一点。JavaScript中的匿名函数真的很糟糕吗?如果是,为什么 不,匿名函数在web上的JavaScript中随处可见。这可能会使现场调试更加困难,但还不足以说不应该使用它们 例如,JQuery广泛使用了它们 很多时候,您希望在正式声明的函数上使用它们,例如,当您想要限制它们的范围时 相反,lambdas(别名)使一些表达式更加简洁。例如,如果要将多个事件处理程序绑定到多个事件,那么为每

我读到在javascript中使用匿名函数是一种不好的做法,因为它会让调试变得很痛苦,但我自己还没有看到这一点。JavaScript中的匿名函数真的很糟糕吗?如果是,为什么

不,匿名函数在web上的JavaScript中随处可见。这可能会使现场调试更加困难,但还不足以说不应该使用它们

例如,JQuery广泛使用了它们


很多时候,您希望在正式声明的函数上使用它们,例如,当您想要限制它们的范围时

相反,lambdas(别名)使一些表达式更加简洁。例如,如果要将多个事件处理程序绑定到多个事件,那么为每个事件处理程序指定函数名将是一件乏味的事情


它比没有更有用,更节省时间,即使它使调试变得有点困难,但我很少在调试中挣扎,因为函数是匿名的。您应该使用JSLint使您的编码更加容易。

最肯定的不是,lambda函数到处都在使用,几乎无处不在。

仅仅因为每个人都使用它们并不能使它们成为良好的实践(每个人都记得在布局中使用table元素吗?)。但是,它们很好,因为它们可以帮助澄清和简化代码,减少出错的机会


但是,匿名函数不应该如此复杂,以至于调试变得困难。在这种情况下,或许最好创建一个新函数。

我将在这里稍微违背流程,说明匿名函数确实是一种糟糕的做法,尽管它们被广泛使用

1) 匿名函数不能重用

2) 根据定义,匿名函数没有名称,因此不描述它们的功能。也就是说代码不是自我记录的

3) 匿名函数不能与单元测试框架隔离测试

4) 我个人认为它们使代码更难阅读和调试。尽管你的经历可能会有所不同

我确实认为在某些情况下,匿名函数是最好的选择,作为一般规则,为了避免上述缺点,我几乎总是命名我的函数


通常,匿名函数的时间越长,它就越有可能从拥有名称中获益

这是我的浏览器控制台:

// Bad
poopy = function(){}
// function (){}
groupy = poopy;
// function (){}

// Good
droopy = function loopy(){};
// function loopy(){}
floupy = droopy;
// function loopy(){}   

假设您正在调试某个东西,并且有一个名为
groupy
的函数名。您可以键入它的名称以获取更多信息。如果该函数被设置为bad部分,那么您不知道原始声明是什么。但是,如果您像Good部分那样定义了函数名,那么您将始终保留原始函数名的痕迹。

实际上,这是我停止使用jQuery的原因之一。确定一个bug是代码中的语法错误、代码中的逻辑错误还是jQuery本身的某些错误所花费的时间总是比我认为合理的要长得多。你必须承认,匿名函数的调用堆栈并不像一个命名函数那样一目了然。你可以始终使用。你可以始终使用。@MarcelKorpel:你提供的链接已经失效,但我想你的意思是你可以选择向匿名函数添加名称(使其不再匿名)如下所示:
var fAnonymous=(函数nonAnon(){})。这确实有助于调试WIM。为了记录在案,我链接到的那篇文章现在已经开始了。仅仅因为一些东西很普通并不意味着它是正确的。使用匿名函数可能没有错,但说“每个人都这样做”并不能构成一个有效的论点。深度嵌套的sass到处都是,但它完全是错误的开发人员工具和构建/模块策略自2010年以来已经走过了很长的路。。Chrome/WebKit非常好,FireBug非常好,但是足够了(命名函数表达式也可以在视觉上有所帮助)。无论如何,考虑到它们被使用的次数,这是一个。。可疑的公理,可能与“太聪明”和难以遵循/调试的代码有关。。因为调试代码时我从未感到痛苦;-)1) 匿名函数和闭包可以重复使用,每个函数都是值,可以分配给变量或作为函数参数提供-这只是在正确的级别/范围公开函数对象的问题;2) 匿名函数(或函数表达式)可以给出显式名称,但在上下文中是“匿名”的;3) 取决于测试的内容、测试的方式以及功能对象的公开方式;4) 闭包/lambda在“太聪明”的情况下可能会被滥用,但糟糕的编码者就是糟糕的编码者,即使是最琐碎的过程性代码语句……我对你在这里所说的感到困惑。如果你给一个函数起一个名字并把它赋给一个变量,那么它不是一个匿名函数吗?你能举个匿名的例子吗?问题是术语“匿名”函数是一个谎言。实际术语应该是函数表达式或闭包,甚至是lambda(这与顶级“函数语句”或“方法”不同)。因为一个人怎么能在没有名字的情况下使用“匿名”函数(IIFE除外)?我不同意。在您的示例中,传递到名为forEach的函数中的函数没有名称。我同意在以后使用时为其指定了名称,但在创建它的上下文中没有名称。它是在我上面列出的4个要点所在的上下文中创建的。如果您在示例中使用描述其功能的标识符,而不是经典的
foo
bar
标识符,您的答案将更加清晰。听了第三首韵后,我的眼睛变得呆滞了