Javascript Массив функций - PullRequest
       6

Javascript Массив функций

114 голосов
/ 05 февраля 2011
var array_of_functions = [
    first_function('a string'),
    second_function('a string'),
    third_function('a string'),
    forth_function('a string')
]

array_of_functions[0];

Это не работает должным образом, потому что каждая функция в массиве выполняется при создании массива.

Как правильно выполнить любую функцию в массиве, выполнив:

array_of_functions[0];  // or, array_of_functions[1] etc.

Спасибо!

Ответы [ 17 ]

214 голосов
/ 05 февраля 2011
var array_of_functions = [
    first_function,
    second_function,
    third_function,
    forth_function
]

и затем, когда вы хотите выполнить данную функцию в массиве:

array_of_functions[0]('a string');
100 голосов
/ 11 декабря 2012

Я думаю, что именно этого и хотел добиться оригинальный плакат:

var array_of_functions = [
    function() { first_function('a string') },
    function() { second_function('a string') },
    function() { third_function('a string') },
    function() { fourth_function('a string') }
]

for (i = 0; i < array_of_functions.length; i++) {
    array_of_functions[i]();
}

Надеюсь, это поможет другим (таким как я 20 минут назад :-) в поисках подсказок о том, как вызывать функции JS в массиве.

22 голосов
/ 05 февраля 2011

Без более подробной информации о том, что вы пытаетесь достичь, мы как бы догадываемся. Но вы можете избежать использования нотации объектов, чтобы сделать что-то вроде этого ...

var myFuncs = {
  firstFunc: function(string) {
    // do something
  },

  secondFunc: function(string) {
    // do something
  },

  thirdFunc: function(string) {
    // do something
  }
}

и позвонить одному из них ...

myFuncs.firstFunc('a string')
15 голосов
/ 05 февраля 2011

Или просто:

var myFuncs = {
  firstFun: function(string) {
    // do something
  },

  secondFunc: function(string) {
    // do something
  },

  thirdFunc: function(string) {
    // do something
  }
}
10 голосов
/ 28 февраля 2014

Я бы дополнил этот поток, опубликовав более простой способ выполнения различных функций в массиве, используя shift() Javascript метод , первоначально описанный здесь

  var a = function(){ console.log("this is function: a") }
  var b = function(){ console.log("this is function: b") }
  var c = function(){ console.log("this is function: c") }

  var foo = [a,b,c];

  while (foo.length){
     foo.shift().call();
  }
6 голосов
/ 12 марта 2015

По сути, это то же самое, что и Darin Dimitrov's, но оно показывает, как его можно использовать для динамического создания и хранения функций и аргументов. Я надеюсь, что это полезно для вас:)

var argsContainer = ['hello', 'you', 'there'];
var functionsContainer = [];

for (var i = 0; i < argsContainer.length; i++) {
var currentArg = argsContainer[i]; 

  functionsContainer.push(function(currentArg){
    console.log(currentArg);
  });
};

for (var i = 0; i < functionsContainer.length; i++) {
  functionsContainer[i](argsContainer[i]);
}
2 голосов
/ 20 марта 2018

вверху мы видели некоторые с итерацией. Давайте сделаем то же самое, используя forEach:

var funcs = [function () {
        console.log(1)
  },
  function () {
        console.log(2)
  }
];

funcs.forEach(function (func) {
  func(); // outputs  1, then 2
});
//for (i = 0; i < funcs.length; i++) funcs[i]();
1 голос
/ 09 апреля 2015

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

function func_one(arg) {
    console.log(arg)
};

function func_two(arg) {
    console.log(arg+' make this different')
};

var obj = {
    callbacks: [func_one, func_two],
    params: ["something", "something else"];
};

function doSomething(obj) {
    var n = obj.counter
    for (n; n < (obj.callbacks.length - obj.len); n++) {
        obj.callbacks[n](obj.params[n]);
    }
};

obj.counter = 0;
obj.len = 0;
doSomething(obj); 

//something
//something else make this different

obj.counter = 1;
obj.len = 0;
doSomething(obj);

//something else make this different
1 голос
/ 12 мая 2013

Это правильно

var array_of_functions = {
            "all": function(flag) { 
                console.log(1+flag); 
              },
                "cic": function(flag) { 
                console.log(13+flag); 
              }                     
        };

array_of_functions.all(27);
array_of_functions.cic(7);
0 голосов
/ 11 июля 2019

У меня много проблем, пытаясь решить эту ... попробовал очевидное, но не сработало.Он просто как-то добавляет пустую функцию.

array_of_functions.push(function() { first_function('a string') });

Я решил это с помощью массива строк, а позже с помощью eval:

array_of_functions.push("first_function('a string')");

for (var Func of array_of_functions) {
   eval(Func);
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...