Преобразование массива в список аргументов функции
Можно ли преобразовать массив в JavaScript в последовательность аргументов функции? Пример:
run({ "render": [ 10, 20, 200, 200 ] });
function run(calls) {
var app = .... // app is retrieved from storage
for (func in calls) {
// What should happen in the next line?
var args = ....(calls[func]);
app[func](args); // This is equivalent to app.render(10, 20, 200, 200);
}
}
Ответы
Ответ 1
Да. В текущих версиях JS вы можете использовать:
app[func]( ...args );
Пользователи ES5 и старше должны будут использовать метод .apply()
:
app[func].apply( this, args );
Прочитайте оба метода в MDN: .apply(), распространите оператор "..."
EDIT - оригинальный ответ указал this||window
в качестве первого аргумента в версии .apply()
. В браузерах this
разрешает window
если вы вызовете вне метода в любом случае, и window
также зависит от браузера, поэтому давайте избавимся от него.
Ответ 2
Очень читаемый пример из другого сообщения по аналогичной теме:
var args = [ 'p0', 'p1', 'p2' ];
function call_me (param0, param1, param2 ) {
// ...
}
// Calling the function using the array with apply()
call_me.apply(this, args);
И здесь ссылка на оригинальное сообщение, которое мне лично понравилось для его читаемости
Ответ 3
app[func].apply(this, args);
Ответ 4
Возможно, вы захотите взглянуть на аналогичный вопрос, размещенный в Stack Overflow. Для этого используется метод .apply()
.
Ответ 5
@bryc - да, вы могли бы сделать это вот так:
Element.prototype.setAttribute.apply(document.body,["foo","bar"])
Но это похоже на большую работу и обфускацию по сравнению с:
document.body.setAttribute("foo","bar")