javascript中的闭包工厂函数是否有一些流行的命名约定?

javascript中的闭包工厂函数是否有一些流行的命名约定?,javascript,coding-style,closures,naming-conventions,Javascript,Coding Style,Closures,Naming Conventions,我正在为我的开发团队编写一个javascript风格指南,并尝试加入一些命名约定 为了避免嵌套闭包,我在指南中添加了一条规则,即编写闭包工厂而不是嵌套闭包(并在根级别编写命名回调而不是嵌套闭包)。它允许展平函数定义并将最大嵌套级别设置为2 例如,与此相反: function main (userName) { var foo = ['bar', 'baz'] foo.forEach(function (item) { console.info(userName + ' add

我正在为我的开发团队编写一个javascript风格指南,并尝试加入一些命名约定

为了避免嵌套闭包,我在指南中添加了一条规则,即编写闭包工厂而不是嵌套闭包(并在根级别编写命名回调而不是嵌套闭包)。它允许展平函数定义并将最大嵌套级别设置为2

例如,与此相反:

function main (userName) {
  var foo = ['bar', 'baz']

  foo.forEach(function (item) {
    console.info(userName + ' add the ' + item + 'event listener')
    document.addEventListener(item, function (evt) {
      setTimeout(function () {
        console.log('event fired: ', evt.type)
      }, 1000)
    })
  })
}
规则说要做到这一点:

function main (userName) {
  var foo = ['bar', 'baz']

  _.forEach(foo, createClosure_addEachListener(userName))
}

function createClosure_addEachListener (userName) {
  return addEachListener

  function addEachListener (item) {
    console.info(userName + ' add the ' + item + 'event listener')
    document.addEventListener(item, logEventIn1Second)
  }
}

function logEventIn1Second (evt) {
  var functionToCall = logEvent.bind(evt.type)
  doItIn1Second(functionToCall)
}

function doItIn1Second (func) {
  setTimeout(func, 1000)
}

function logEvent (type) {
  console.log('event fired: ', type)
}
这个例子故意做得过火了。当然,在这种简单的情况下,不需要应用此规则,这会使代码更难阅读。但是,如果闭包更复杂或需要很多行代码,则此规则可以显著减少函数定义的大小并简化代码的读取。此外,该技术具有非常显著的性能影响。事实上,在第一个示例(嵌套闭包)中,包含
setTimeout
调用的匿名函数和包含
console.log
调用的匿名函数被定义为数组的长度,因为它们被定义在
foo.forEach
循环回调中。另一方面,在第二种情况下(遵循“展平闭包”规则),不使用任何闭包的范围变量的闭包被转换为标准函数(或回调),而不是闭包。而且,它们只定义了一次

所以规则说了两件事:

  • 展平所有函数定义(除非它们非常简单)
  • 如果函数是闭包(如果函数使用闭包作用域的至少一个变量),则创建一个返回闭包的包装函数(在示例中:
    createClosure\u addachlistener
    ),并将所有需要的变量作为包装函数的参数传递,以重新创建闭包所需的最小作用域
我的问题 因此,在我的示例中,我调用了包装函数
createClosure\u addachlistener
。我用这种方式来命名这个函数之王(
createClosure\uu

但是我搜索了一下是否存在一个标准的或者只是流行的惯例来命名这种关闭工厂


有人知道这样的命名约定吗?

foo.each
?那是图书馆吗
.forEach
这代表什么?我有一种模糊的感觉,你正在用闭包(在父函数范围内定义和实例化/返回的函数)混合简单的回调。是的,
foo.forEach
,这是一个拼写错误,对不起,我在帖子中修复了它。但这并不是问题的主题。不,我没有混淆闭包和回调,我想在橙色引用块中应该清楚这一点,特别是说«另一方面,第二种情况(遵循“扁平闭包”规则),不使用任何闭包的范围变量的闭包被转换为标准函数(或回调),而不是闭包»