Как "пересылать" аргументы функции "все-но-аргументы" функции другой функции?

Как перенаправить аргументы из функции в другую функцию?

У меня есть это:

function SomeThing(options) {
  function callback(callback_name) {
    if(options[callback_name]) {
      // Desiring to call the callback with all arguments that this function
      // received, except for the first argument.
      options[callback_name].apply(this, arguments);
    }
  }
  callback('cb_one', 99, 100);
}

То, что я получаю в аргументе a, это "cb_one", но я хочу, чтобы оно было "99".

var a = new SomeThing({
  cb_one: function(a,b,c) {
    console.log(arguments); // => ["cb_one", 99, 100]
    console.log(a);         // => cb_one
    console.log(b);         // => 99
    console.log(c);         // => 100
  }
});

Как это сделать?

Ответ 1

Используйте options[callback_name].apply(this, [].slice.call(arguments,1));

[].slice.call(arguments,1) преобразует аргументы ('array-like') Object в реальный Array содержащий все аргументы, но первый,

[].slice.call также может быть записано как Array.prototype.slice.call.

Ответ 2

Вы можете делать то, что делает Kooilnc. Лично мне не нравится писать [].slice.call или Arrray.prototype.slice.call. Вместо этого я делаю это:

var bind = Function.bind;
var call = Function.call;

var bindable = bind.bind(bind);
var callable = bindable(call);

// this is the same as Array.prototype.slice.call
var arrayFrom = callable(Array.prototype.slice);

Теперь вы можете просто:

options[callback_name].apply(this, arrayFrom(arguments, 1));

Для получения дополнительной информации о bindable и callable обратитесь к людям в чат-комнате JavaScript: http://chat.stackoverflow.com/rooms/17/javascript