匿名函数被认为有害吗?

时间:2009-12-25 05:00:44

标签: javascript language-design anonymous-function

我越深入研究javascript,就越会考虑某些设计决策和鼓励实践的后果。在这种情况下,我正在观察匿名函数,这个函数不仅是JavaScript提供的,而且我看到强烈使用。

我认为我们都同意以下事实:

  • 人类思维不会处理超过7个减去两个实体(Miller's law
  • 深度缩进被视为bad programming practice,如果缩进超过三个或四个级别,通常会指出设计问题。这扩展到嵌套实体,并且它在python Zen条目“Flat is than than cested”中得到很好的呈现。
  • 具有函数名称的想法既可供参考,也可轻松记录其执行的任务。我们知道或者可以预期一个名为removeListEntry()的函数。自我记录,清晰的代码对于调试和可读性非常重要。

虽然匿名函数似乎是一个非常好的功能,但它的使用导致了深层嵌套的代码设计。代码编写速度快,但难以阅读。它不是被迫为一个功能发明一个命名的上下文,而是压缩你的可调用对象的层次结构,而是鼓励“深入一层”,推动你的大脑堆叠,并迅速溢出7 +/- 2规则。类似的概念在Alan Cooper的“About Face”中表达,引用松散的“人们不理解等级”。作为程序员,我们确实理解了层次结构,但是我们的生物学仍然限制了我们对深层嵌套的掌握。

我想在这一点上听到你的意见。如果匿名功能被认为是有害的,那么我们后来发现的一种明显有光泽的语法糖是盐,甚至是鼠毒?

CW因为没有正确答案。

8 个答案:

答案 0 :(得分:16)

正如我所看到的,您面临的问题不是匿名功能,而是不愿意将功能分解为有用且可重用的单元。这很有意思,因为在具有第一类功能(以及必然是匿名功能)的语言中重用功能更容易而不是没有语言的语言。

如果你在代码中看到很多深层嵌套的匿名函数,我会建议可能有许多常见的功能可以被分解为命名的高阶函数(即获取或返回的函数(“build”) “)其他功能)。如果经常使用现有函数的“简单”转换,则应给它们命名。这只是DRY原则。

答案 1 :(得分:8)

匿名函数在功能上比它们有害的更有用。我认为如果你足够好地格式化你的代码,你应该没有问题。我没有问题,我确定我无法处理7个元素,更不用说7 + 2了:)

答案 2 :(得分:4)

实际上,层次结构有助于以与OOP相同的方式克服7 +/- 2规则。当您正在编写或阅读课程时,您会阅读其内容而不阅读外部代码,因此您正在处理相对较小部分的实体。当您查看类层次结构时,您不会查看它们,这意味着您再次处理少量实体。

对于嵌套函数,如果为true。通过将代码划分为多个层次结构,可以使每个级别保持足够小,以便人类大脑能够理解。

闭包(或匿名函数)只是帮助您将代码分解为与OOP略有不同的方式,但它们并不真正创建任何层次结构。它们可以帮助您在其他代码块的上下文中执行代码。在C ++或Java中你必须为它创建一个类,在JavaScript函数中就足够了。当然,独立类更容易理解,因为人们在独立块中更容易看到它。功能似乎在尺寸上要小得多,大脑有时会认为它可以理解它并同时围绕它进行编码,这通常是一个坏主意。但你可以训练你的大脑不要这样做:)

所以不,我不认为匿名函数对你有害,你必须学会​​处理它们,因为你学会了处理类。

答案 3 :(得分:3)

有趣的是,JavaScript会让你命名“匿名”函数:

function f(x) {
   return function add(y) {
        return x+y;
   };
}

答案 4 :(得分:2)

我认为封闭具有巨大的好处,不容忽视。例如,Apple通过GCD利用“块”(C的闭包)来提供非常简单的多线程 - 您不需要设置上下文结构,并且只能按名称引用变量,因为它们在范围内。

我认为Javascript的一个更大的问题是它没有块范围(在这种情况下,块指的是括号中的代码,如if语句)。这可能会导致巨大的复杂性,迫使程序员使用不必要的闭包来解决这个Javascript设计限制。

答案 5 :(得分:0)

我还认为匿名函数(在最新语言中通常称为闭包)具有很大的好处,并且使代码通常更具可读性和更短。当我必须使用Java(封闭不是一流语言功能)时,我有时会变得非常疯狂。

如果缩进和太多封装的函数变量是问题,那么你应该重构代码以使其更具模块性和可读性。

关于java-script我认为函数变量看起来很丑陋并且使代码变得混乱(封装的函数(...){}字符串使得java脚本代码通常不太可读)。作为一个例子,我更喜欢groovy('{}'和' - >'字符)的闭包语法。

答案 6 :(得分:0)

如果某个函数在没有名称的情况下无法理解,则名称可能太长。 使用注释来解释含糊的代码,不要依赖于名称。

答案 7 :(得分:-2)

谁想到了要求函数绑定到标识符的想法,每个程序员都会受到伤害。如果你从未完成函数式编程,并且你不熟悉并且不熟悉函数是一流的值,那么你就不是真正的程序员。

事实上,为了反驳你自己的论点,我甚至会考虑绑定到(全局)名称的函数是有害的!查看Crockford's article about private and public members并了解详情。