Передача массива функций другой функции

Я пытаюсь передать произвольное количество аргументов функции. Аргументы должны быть json type [function: arrayOfArgs]. Ключи - это функции, а значения - массивы аргументов, которые должны быть переданы этим функциям.

Сначала я рассматривал функцию только с рядом аргументов

function _gl(f,args){ f.apply(null,args); }
 function func(a,b){ alert(a+b); }

//вызов функции

и он работает очень хорошо. Теперь я пытаюсь обобщить этот метод

function _GL(){
 var arguments = _GL.arguments; 
 var i=0;
 for(i;i
<p>//и вызывая его</p> <p> но я получаю следующую ошибку: "Некопать TypeError: объект func не имеет метода" apply ".</p>
3 ответа

Вы можете использовать этот код jsFiddle:

_GL = function() {
 var arguments = _GL.arguments;
 var i = 0;
 for (i = 0; i < arguments.length; i++) {
 var arg = arguments[i];
 for (j in arg) {
 var f = window[j];
 f.apply(null, arg[j]);
 }
 }
};

Как вы можете видеть, вы должны сначала получить свою функцию f от элемента window по ее имени. Тогда f имеет правильный тип a args.


Одно из возможных решений:

var _gl = function (callables) {
 // Loop through each property in the passed in object
 for (var fnName in callables) {
 // Only apply for properties that is local to `callables`
 if (callables.hasOwnProperty(fnName)) {
 window[fnName].apply(callables[property]);
 }
 }
};
... onclick='_gl({"MyFunction": ["a", 1, []]});' ...

Вместо использования глобального пространства имен вы можете (и должны!) настроить объект с вашими вызываемыми функциями.


{func:['2','3']}

Вы создаете объект с (строковым) ключом под названием "func" со значением ['2','3']. Строки не являются функциями, поэтому у него нет .apply().

В объектах ваши ключи должны быть строками, вы не можете использовать другие типы в качестве ключей.

Чтобы "обобщить" его, вы должны передать ему массив функций и их аргументы. Что-то вроде этого:

[[func, ['2','3']], [func2, ['abc']]

Итак, если вы это сделали:

onclick="_GL([[func, ['2','3']], [func2, ['abc']]);"

Затем вы можете выполнить цикл и получить функции и вызвать их.

function _GL(funcs){
 for(var i=0, len=funcs.length; i < len; i++){
 var func = funcs[i];
 func[0].apply(null, func[1]);
 }
}

licensed under cc by-sa 3.0 with attribution.