如何命名生成闭包的函数

时间:2014-01-20 11:28:37

标签: closures naming-conventions naming

我理解闭包,即使我几乎不使用它们,但每当我可以挤一个,我不知道如何命名它。

我能想到的最好的事情就是在功能名称之前加上“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,但它没有说明这一点。

1 个答案:

答案 0 :(得分:1)

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

不是定义“闭包”,而是更容易定义闭包产生的环境。

一个(词法)闭包(在javascript中)发生并且只要存在对内部函数的持久外部引用就会继续存在,但是外部函数和内部函数以及对内部函数的引用本身都不是关闭。从语用上讲,闭包是一个包含所有这些元素的构造,加上语言的一个特征,当垃圾收集存在时,垃圾收集就会被抑制。

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

无论如何,为返回的函数提供一个基于动词的名称,就像任何其他命名函数一样 - 不需要另外考虑它,因为它是由另一个函数返回的。在每个方面,返回的函数只是一个函数 - 它恰好是一个函数,可以访问外部函数的(执行上下文)的作用域链,使其成为 - 只不过是。

编辑:

我刚刚意识到我没有解决问题的关键点 - 重新描述“如何命名一个函数,该函数是为了通过返回函数来形成闭包的明确目的”。

和你一样,我在这里遇到了问题。

我经常使用“make”前缀,如您的示例所示。这似乎在大多数时候都是最好的。

我还使用“_closure”作为后缀,这不遵守“动词规则”,但具有独立于自然语言的优点。 “Make”严格来说是英文单词,其他语言的发言者可能会选择使用自己的“faire”,“machen”等。另一方面,“封闭”是普遍的 - 据我所知,它仍然存在,未翻译的其他语言。因此,作为后缀(或前缀)的“闭包”在可能在全球范围内使用/修改的脚本中可能更好。