我越深入研究javascript,就越会考虑某些设计决策和鼓励实践的后果。在这种情况下,我正在观察匿名函数,这个函数不仅是JavaScript提供的,而且我看到强烈使用。
我认为我们都同意以下事实:
虽然匿名函数似乎是一个非常好的功能,但它的使用导致了深层嵌套的代码设计。代码编写速度快,但难以阅读。它不是被迫为一个功能发明一个命名的上下文,而是压缩你的可调用对象的层次结构,而是鼓励“深入一层”,推动你的大脑堆叠,并迅速溢出7 +/- 2规则。类似的概念在Alan Cooper的“About Face”中表达,引用松散的“人们不理解等级”。作为程序员,我们确实理解了层次结构,但是我们的生物学仍然限制了我们对深层嵌套的掌握。
我想在这一点上听到你的意见。如果匿名功能被认为是有害的,那么我们后来发现的一种明显有光泽的语法糖是盐,甚至是鼠毒?
CW因为没有正确答案。
答案 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并了解详情。