closures - 如何命名产生闭包的函数

标签 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”。我喜欢给我的所有函数一个动词作为名称:函数“做东西”,它们的名字反射(reflect)了它(“sortSelection”,“populateForm”)。本着同样的精神,我应该如何命名“做某事”的闭包?你使用什么约定,最常见的是什么?

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

最佳答案

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

与其定义“闭包”,不如定义闭包发生的环境。

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

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

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

编辑:

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

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

大多数情况下,我使用“make”前缀,如您的示例所示。大多数时候这似乎是最好的。

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

关于closures - 如何命名产生闭包的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21232832/

相关文章:

python - 在 python 中初始化 lambda 函数列表

javascript - 这是闭包在 useState 钩子(Hook)中的工作方式吗?

java - EL 无法处理下划线之前的单个字符?

c# - 接口(interface) "IRepository<T>"的正确文件名是什么

c++ - 这个围绕 std::future::then 的便利包装器有名称吗?

javascript - 无法使用 Node.js 从内部函数访问异步方法的本地范围

lisp - 在 LISP 中如何检查闭包中的自由变量?

c++ - C++ 中相同的类成员名称和函数参数名称

Java 类和接口(interface)命名问题

algorithm - 回答 'yes' 或 'maybe' 的决策算法的名称是什么?