Как включить аргумент, основанный на условии (в CoffeeScript / JavaScript)? - PullRequest
1 голос
/ 12 сентября 2011

Я написал функцию 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');
  }
};

Существует ли СУХОЙ подход к этой функции, который бы исключил повторный вызов 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 ]

2 голосов
/ 12 сентября 2011

Прежде всего, я думаю, что код в вашем исходном вопросе в порядке (кроме = 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 голос
/ 12 сентября 2011

Используйте комбинацию:

  • Array.splice() для добавления дополнительных параметров в массив параметров и
  • apply() для вызова функции с массивом параметров.

Вот демоверсия:

http://jsfiddle.net/ZSVtB/

0 голосов
/ 12 сентября 2011
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.

...