如何根据条件包含参数(在CoffeeScript / JavaScript中)?

时间:2011-09-12 13:13:57

标签: javascript google-analytics dry coffeescript google-analytics-api

我写了一个类似于这个人为例子的CoffeeScript函数:

my_func = (a, b, use_args = false) ->
  if use_args?
    other_func 'foo', a, b, 'bar'
  else
    other_func 'foo', 'bar'

这将编译为以下JavaScript:

var my_func;
my_func = function(a, b, use_args) {
  if (use_args == null) {
    use_args = false;
  }
  if (use_args != null) {
    return other_func('foo', a, b, 'bar');
  } else {
    return other_func('foo', 'bar');
  }
};

这个函数是否有DRY方法可以消除对other_func的重复调用?类似的东西:

my_func = (a, b, use_args = false) ->
  other_func 'foo', a if use_args?, b if use_args?, 'bar'

但这实际上在语法上是正确的吗?希望我不会错过这里明显的东西。我不确定CoffeeScript是否提供了一种方便的方法,或者我是否应该使用更好的JavaScript模式。

顺便说一句,我无法修改other_func以使用不同的参数,因为它实际上是_gaq.push(),是Google Analytics库的一部分,它将跟踪信息添加到队列中。

3 个答案:

答案 0 :(得分:2)

首先,我认为原始问题中的代码很好(除了参数列表中的= false - 请参阅我的评论)。它非常高效和可读。但如果重复真的困扰你,请继续阅读。

克里斯在他的回答中走在正确的轨道上。由于这是CoffeeScript,因此您可以利用一些语法糖:

  • 您可以写arr.splice(1, 0, [a, b])而不是arr[1...1] = [a, b]

  • 您只需撰写func.apply(null, arr),而不是func arr...

所以,结合这些,你可以将你的功能降低到3个简短,无重复的行:

my_func = (a, b, use_args) ->
  args = [foo, bar]
  args[1...1] = [a, b] if use_args
  other_func args...

请注意,您不必进行use_args?检查;如果是nullundefined,则false会自动(通过JavaScript)强制if use_args

答案 1 :(得分:1)

使用以下组合:

这是一个演示:

http://jsfiddle.net/ZSVtB/

答案 2 :(得分:-1)

var my_func = function(a, b, use_args) { 
  var args = []
  args.push('foo')
  use_args && args.push(a, b)
  args.push('bar')
  return other_func.apply(null, args)
}

好的,从现在开始没有with