wake-up-neo.com

Javascript-Array mit Funktionen

var array_of_functions = [
    first_function('a string'),
    second_function('a string'),
    third_function('a string'),
    forth_function('a string')
]

array_of_functions[0];

Das funktioniert nicht wie beabsichtigt, da jede Funktion im Array ausgeführt wird, wenn das Array erstellt wird.

Was ist die richtige Art, eine Funktion im Array auszuführen, indem Sie Folgendes tun:

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

Vielen Dank!

111
Nick
var array_of_functions = [
    first_function,
    second_function,
    third_function,
    forth_function
]

und dann, wenn Sie eine bestimmte Funktion im Array ausführen möchten:

array_of_functions[0]('a string');
211
Darin Dimitrov

Ich denke, das war es, was das Originalplakat zu erreichen hatte:

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]();
}

Hoffentlich hilft dies anderen (wie mir vor 20 Minuten :-) und sucht nach Hinweisen, wie man JS-Funktionen in einem Array aufruft.

96
pjcabrera

Ohne mehr Details von dem, was Sie zu erreichen versuchen, raten wir irgendwie. Aber Sie können vielleicht mit der Objektnotation fertig werden, um so etwas zu tun ...

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

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

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

und einen von ihnen anzurufen ...

myFuncs.firstFunc('a string')
21
Jeff

Oder nur:

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

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

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

Ich würde diesen Thread ergänzen, indem ich einen einfacheren Weg poste, verschiedene Funktionen innerhalb eines Arrays mit der shift() Javascript-Methode auszuführen, die ursprünglich hier beschrieben wurde .

  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();
  }
10
Gus

Es ist im Grunde dasselbe wie Darin Dimitrov's, aber es zeigt, wie Sie es verwenden können, um Funktionen und Argumente dynamisch zu erstellen und zu speichern. Ich hoffe, es ist nützlich für Sie :)

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]);
}

6

oben sahen wir einige mit Iteration. Machen wir dasselbe mit 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]();
2
mlhazan

Wenn Sie beispielsweise versuchen, Rückrufe dynamisch zu übergeben, können Sie ein einzelnes Objekt als Argument übergeben. Dadurch haben Sie viel mehr Kontrolle darüber, welche Funktionen Sie mit beliebigen Parametern ausführen möchten.

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
Daniel Lizik

Das ist richtig

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);
1

Ausführung vieler Funktionen durch einen ES6-Callback ????

const f = (funs) => {
  funs().forEach((fun) => fun)
}

f(() => [
  console.log(1),
  console.log(2),
  console.log(3)
])

0
Thomas Gotwig

die Probleme dieses Array von Funktionen liegen nicht in der "Array-Form", sondern in der Art, wie diese Funktionen aufgerufen werden ... dann ... versuchen Sie es mit einem einfachen eval () ...

array_of_function = ["fx1()","fx2()","fx3()",.."fxN()"]
var zzz=[];
for (var i=0; i<array_of_function.length; i++)
     { var zzz += eval( array_of_function[i] ); }

es ist Arbeit hier, wo nichts Höheres den Job zu Hause erledigt hat ... hofft, dass es helfen wird

0
Quetzal

Ein kurzer Weg, sie alle auszuführen:

[first_function, ..., nth_function].forEach (function(f) {
    f('a string');
}); 
0
Danyal Aytekin

Function.prototype.bind () verwenden

var array_of_functions = [
        first_function.bind(null,'a string'),
        second_function.bind(null,'a string'),
        third_function.bind(null,'a string'),
        forth_function.bind(null,'a string')
    ]
0
YakuZa

Ich habe viele Probleme damit, dieses Problem zu lösen ... habe das Offensichtliche versucht, aber es hat nicht funktioniert. Es wird nur irgendwie eine leere Funktion angehängt.

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

Ich habe es mit einer Reihe von Strings gelöst und später mit eval:

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

for (var Func of array_of_functions) {
   eval(Func);
   }
0
Nezumi

Vielleicht kann es jemandem helfen.

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">
        window.manager = {
            curHandler: 0,
            handlers  : []
        };

        manager.run = function (n) {
            this.handlers[this.curHandler](n);
        };

        manager.changeHandler = function (n) {
            if (n >= this.handlers.length || n < 0) {
                throw new Error('n must be from 0 to ' + (this.handlers.length - 1), n);
            }
            this.curHandler = n;
        };

        var a = function (n) {
            console.log("Handler a. Argument value is " + n);
        };

        var b = function (n) {
            console.log("Handler b. Argument value is " + n);
        };

        var c = function foo(n) {
            for (var i=0; i<n; i++) {
                console.log(i);
            }
        };

        manager.handlers.Push(a);
        manager.handlers.Push(b);
        manager.handlers.Push(c);
    </script>
</head>
<body>
<input type="button" onclick="window.manager.run(2)" value="Run handler with parameter 2">
<input type="button" onclick="window.manager.run(4)" value="Run handler with parameter 4">
<p>
<div>
    <select name="featured" size="1" id="item1">
        <option value="0">First handler</option>
        <option value="1">Second handler</option>
        <option value="2">Third handler</option>
    </select>
    <input type="button" onclick="manager.changeHandler(document.getElementById('item1').value);" value="Change handler">
</div>
</p>
</body>
</html>
0
Hopkroft