Ответ 1
var array_of_functions = [
first_function,
second_function,
third_function,
forth_function
]
а затем, когда вы хотите выполнить заданную функцию в массиве:
array_of_functions[0]('a string');
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.
Спасибо!
var array_of_functions = [
first_function,
second_function,
third_function,
forth_function
]
а затем, когда вы хотите выполнить заданную функцию в массиве:
array_of_functions[0]('a string');
Я думаю, что это то, что должен был сделать оригинальный плакат:
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 в массиве.
Без дополнительной информации о том, чего вы пытаетесь достичь, мы догадываемся. Но вы можете уйти с использованием нотации объектов, чтобы сделать что-то вроде этого...
var myFuncs = {
firstFunc: function(string) {
// do something
},
secondFunc: function(string) {
// do something
},
thirdFunc: function(string) {
// do something
}
}
и вызвать один из них...
myFuncs.firstFunc('a string')
Или просто:
var myFuncs = {
firstFun: function(string) {
// do something
},
secondFunc: function(string) {
// do something
},
thirdFunc: function(string) {
// do something
}
}
Я бы дополнил этот поток, отправив более простой способ выполнить различные функции в массиве, используя метод 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();
}
Он в основном такой же, как у 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]);
}
вверху мы видели некоторые с итерацией. Давайте сделаем то же самое, используя 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]();
Это правильно.
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);
Если вы делаете что-то вроде попыток динамического прохождения обратных вызовов, вы можете передать один объект в качестве аргумента. Это дает вам больший контроль над функциями, которые вы хотите выполнить с любым параметром.
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
Может быть, это может кому-то помочь.
<!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>
Короткий путь запускать все:
[first_function, ..., nth_function].forEach (function(f) {
f('a string');
});
проблема этих массивов функции не в "форме массива", а в том, как называются эти функции... затем... попробуйте это.. с простой 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] ); }
он работает здесь, где ни одна верхняя часть не выполняет работу дома... надеется, что это поможет
Использование функции .prototype.bind()
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')
]
Выполнение многих функций через обратный вызов ES6 🤗
const f = (funs) => {
funs().forEach((fun) => fun)
}
f(() => [
console.log(1),
console.log(2),
console.log(3)
])
У меня много проблем, пытаясь решить эту проблему... пробовал очевидное, но не сработало. Он просто как-то добавляет пустую функцию.
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);
}
у вас есть верхние ответы выше. Это просто еще одна версия.
var dictFun = {
FunOne: function(string) {
console.log("first function");
},
FuncTwo: function(string) {
console.log("second function");
},
FuncThree: function(string) {
console.log("third function");
}
}
/* PlanetGreeter */
class PlanetGreeter {
hello : { () : void; } [] = [];
planet_1 : string = "World";
planet_2 : string = "Mars";
planet_3 : string = "Venus";
planet_4 : string = "Uranus";
planet_5 : string = "Pluto";
constructor() {
this.hello.push( () => { this.greet(this.planet_1); } );
this.hello.push( () => { this.greet(this.planet_2); } );
this.hello.push( () => { this.greet(this.planet_3); } );
this.hello.push( () => { this.greet(this.planet_4); } );
this.hello.push( () => { this.greet(this.planet_5); } );
}
greet(a: string) : void { alert("Hello " + a); }
greetRandomPlanet() : void {
this.hello [ Math.floor( 5 * Math.random() ) ] ();
}
}
new PlanetGreeter().greetRandomPlanet();