【问题标题】:How to name a function that produces a closure如何命名产生闭包的函数
【发布时间】:2014-01-20 11:28:36
【问题描述】:

我了解闭包,尽管我几乎不使用它们,但每当我可以挤压一个时,我都不知道如何命名它。

我能想到的最好的方法是在函数名称之前加上一个“make”:

function makeSortSelection(settings1, settings2) {
    return function() {
        /* sort stuff attending to settings1 and settings2 */
    };
}

$("#sort-button").click(makeSortSelection('ascending',foo));

(我几乎总是在 Javascript 中使用它们,但我想这是一个非常与语言无关的问题)

遗憾的是,我发现的大多数闭包示例只使用“foo”或“sayHello”。我喜欢给我的所有函数一个动词作为名称:函数“do stuff”,它们的名称反映了它(“sortSelection”、“populateForm”)。本着同样的精神,我应该如何命名闭包,即“做一些事情”?您使用什么约定,最常用的是什么?

PD:当我有疑问时,我倾向于使用Google's style guide,但它没有说明这一点。

【问题讨论】:

    标签: closures naming-conventions naming


    【解决方案1】:

    闭包不是可命名的实体。函数是可命名的,但闭包不是函数。

    与其定义“闭包”,不如定义闭包出现的情况。

    只要存在对内部函数的持久外部引用,(在 javascript 中)就会发生并继续存在,但外部函数、内部函数和对内部函数的引用本身都不是,一个关闭。务实地说,闭包是一个包含所有这些元素的构造,加上当它们存在时抑制垃圾收集的语言特性。

    在我看来,正如一些人声称的那样,“所有函数都是闭包”是错误的。是的,所有函数都有一个作用域链,但是只有在外部函数完成并返回,并且存在对内部函数的持久引用时,才应将闭包视为存在。

    无论如何都要给返回的函数一个基于动词的名称,就像任何其他命名函数一样 - 没有必要仅仅因为它是由另一个函数返回而区别对待它。从各个方面来说,返回的函数只是一个函数——它恰好是一个可以访问产生它的外部函数(执行上下文)的作用域链的函数——仅此而已。

    编辑:

    我刚刚意识到我没有解决问题的关键点 - 改写为“如何命名一个存在的函数,以通过返回一个函数来形成闭包”。

    和你一样,我这里有个问题。

    我经常使用“make”前缀,就像你的例子一样。在大多数情况下,这似乎是最好的。

    我也使用了“_closure”作为后缀,这不符合“动词规则”,但具有独立于自然语言的优势。 “Make”严格来说是一个英文单词,说其他语言的人可能会选择使用他们自己的“faire”、“machen”等。另一方面,“closure”是通用的——据我所知,它仍然存在, 未翻译成其他语言。因此,“闭包”作为后缀(或前缀)在可能在全球范围内使用/修改的脚本中可能会更好。

    【讨论】:

    • 谢谢;我只在这种非常简单和明确的例子中使用了闭包,而且我在问题的表述上并不是很准确。使用“closure”前缀很明显也是一个很好的解决方案,尽管仍然不是很优雅。
    • 耶稣,这是个好问题。你只是让我陷入了漫无边际的心情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2015-05-17
    相关资源
    最近更新 更多