Преобразование массива в список аргументов функции

Можно ли преобразовать массив в 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")