JavaScript函数数组


129
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.

谢谢!


1
'a string'在填充数组时是否需要知道,还是函数的调用者可以将其传递进去?
月牙食

我很想详细了解您要完成的工作,因为可能有更好的处理方法。
杰夫,

2
“功能的阵列” -或者我们喜欢称呼它与方法的对象
symcbean

您是否不应该提供更多细节?可能有更好的方法来解决这个问题
。– IcyFlame

Answers:


234
var array_of_functions = [
    first_function,
    second_function,
    third_function,
    forth_function
]

然后要在数组中执行给定函数时:

array_of_functions[0]('a string');

16
提示:请记住放在()后面array_of_functions[0],即使它为空。我花了大约20分钟的时间才找到“为什么不起作用”。
Horacio

像魅力一样工作!
Moses Ndeda

您如何通过传递字符串值(例如“ firstFunction”)来获得函数的索引,从而使其具有动态性?
O'Dane Brissett

106

我认为这就是原始海报要实现的目标:

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函数的任何提示。


3
这正是我所需要的,因为它允许我更改参数调用,并假设我的函数没有全部采用相同的参数:P
Jem 2014年

24

如果没有您要完成的工作的更多细节,我们有点猜测。但是您也许可以摆脱使用对象表示法来做这样的事情...

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

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

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

并打电话给他们之一...

myFuncs.firstFunc('a string')

1
我认为这对开发人员更友好,因为我们不需要记住函数索引。而且,如果我们要在特定索引处推送任何函数,那么它将导致其旁边所有函数的索引发生变化。因此更好地使用它
dd619

16

要不就:

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

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

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

13

我将通过使用本文最初描述shift()Javascript方法发布一种更简单的方法来执行Array中的各种功能的方法来对该线程进行补充

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

7

它基本上与相同,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]);
}


1
无论有多少其他答案,都可以添加答案。但是,最好添加一些解释,以说明与其他
事物

3

在上方,我们看到了一些迭代。让我们使用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

这是对的

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
您确定这是您要回答的问题吗?没关系
贝吉

1
@Bergi实际上是。更换答案是operaarray_of_functions和你有同样的事情。现在怎么样?
杰西

@Jesse谢谢,现在我对发布代码有了一个想法,这是我的第一个回复。
莱昂纳多·恰卡西奥

但是OP有一个数组,而这是一些对象(属性名称为奇数)?这个答案的最新消息是什么,为什么不仅仅支持pjcabrera或Robin的呢?
Bergi

1
令人困惑的变量名称。那不是功能的数组而是功能的对象
Craicerjack 16'Apr

1

如果您正在执行尝试动态传递回调的操作,则可以传递单个对象作为参数。这使您可以更好地控制要使用任何参数执行的功能。

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

通过ES6回调执行许多功能

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

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


0

也许对某人有帮助。

<!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

这些函数数组的问题不在“数组形式”中,而是以调用这些函数的方式...然后...尝试使用简单的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] ); }

它在这里工作,没有上层人员在家完成工作...希望它会有所帮助


您能解释一下为什么其他答案对您不起作用,为什么您的答案不起作用吗?谢谢!
Fabio说恢复Monica

它曾经返回过我错误,未定义的函数,或者它们根本没有被javascript评估...(为什么我不知道,但这解决了我的问题)
Quetzal


是的,像往常一样可怕,但是射击解决方案,并且非常易于使用,尤其是如果它离“输入”很远的话...在这里,它只是用一种简短的方式解决了内部javascript不可能的问题
Quetzal,2017年

0

使用Function.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')
    ]

0

我在尝试解决这一问题时遇到了许多问题。它只是以某种方式附加了一个空函数。

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

-1

您在上面得到了一些最重要的答案。这只是该版本的另一个版本。

var dictFun = {
     FunOne: function(string) {
     console.log("first function");
  },

   FuncTwo: function(string) {
   console.log("second function");
 },

  FuncThree: function(string) {
   console.log("third function");
}

}


2
问题在于功能的数组,而不是对象。
特里科特

-4
/* 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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.