Как "пересылать" аргументы функции "все-но-аргументы" функции другой функции?
Как перенаправить аргументы из функции в другую функцию?
У меня есть это:
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