1

我编写了一个类似于这个人为示例的 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 库的一部分,用于将跟踪信息添加到队列中。

4

3 回答 3

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.

于 2011-09-12T15:02:31.823 回答
1

使用以下组合:

  • Array.splice()将附加参数注入到参数数组中,以及
  • apply()使用参数数组调用函数。

这是一个演示:

http://jsfiddle.net/ZSVtB/

于 2011-09-12T13:36:42.820 回答
-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从现在开始不。

于 2011-09-12T13:25:00.277 回答