我编写了一个类似于这个人为示例的 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 库的一部分,用于将跟踪信息添加到一个队列。
最佳答案
首先,我认为您原始问题中的代码很好(参数列表中的 = false
除外——请参阅我的评论)。它非常高效且可读。但如果重复真的让您感到困扰,请继续阅读。
Chris 的回答是正确的。由于这是 CoffeeScript,您可以利用一些语法糖:
代替
arr.splice(1, 0, [a, b])
,您可以编写arr[1...1] = [a, b]
.您可以简单地编写
func arr...
而不是func.apply(null, 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
,它将被自动(通过 JavaScript)强制为 false
if use_args
。
关于javascript - 如何包含基于条件的参数(在 CoffeeScript/JavaScript 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7388435/