我写了一个类似于这个人为例子的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库的一部分,它将跟踪信息添加到队列中。
答案 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?
检查;如果是null
或undefined
,则false
会自动(通过JavaScript)强制if use_args
。
答案 1 :(得分:1)
答案 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
。