자바 스크립트 함수 배열


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'어레이가 채워지는 시점에서 공지 될 필요하거나 함수 호출 측에 전달할 수 있는가?
Crescent Fresh

더 나은 처리 방법이있을 수 있기 때문에 달성하려는 작업에 대해 더 자세히 알고 싶습니다.
Jeff

2
"함수의 배열"-또는 우리가 그것을 메소드를 가진 객체 라 부르고 자
symcbean

더 자세한 정보를 제공해야한다고 생각하지 않습니까? 이것을 처리하는 더 좋은 방법이있을 수 있습니다 ..
IcyFlame

답변:


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

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
아무리 많은 사람이 있더라도 답변을 추가하는 것이 좋습니다. 그러나 다른 것들과 다른 점 / 더 나은 점에 대한 설명을 추가하는 것이 좋습니다
Bowdzone

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
이것이 당신이 대답하고 싶은 질문 인지 확실 합니까? 관련이 없습니다.
Bergi

1
@Bergi 사실이다. 응답의 교체 opera와를 array_of_functions당신은 같은 일을 가지고있다. 지금은 어때?
Jesse

@Jesse thanks, 이제 코드를 게시하는 아이디어가 있습니다. 이것이 첫 번째 응답입니다.
레오나르도 Ciaccio

그러나 OP에는 배열이 있지만 이것이 이상한 속성 이름을 가진 일부 개체입니까? 그리고이 답변에 대한 뉴스는 무엇입니까? 왜 pjcabrera 나 Robin을 공감하지 않습니까?
Bergi

1
변수 이름이 혼동됩니다. 그것은 함수의 배열이 아니라 함수의 대상입니다
Craicerjack

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에 의하면 Reinstate Monica는

이제까지 정의되지 않은 함수 나 erors 반환하거나 precisly 자바 스크립트에 의해 evalued되지 않습니다 ... (내가 왜 몰라,하지만 이건 내 문제 해결)
퀘찰


예, 끔찍한, 변함없이,하지만 샷 솔루션은 꽤 쉽게 ... 그냥 짧은 방법으로 내부 자바 스크립트 불가를 해결 ... 여기의 경우 지금까지에 "입력"에서 특히 사용
퀘찰

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

0

아 이상한 답변이 너무 많아

const execute = (fn) => fn()
const arrayOfFunctions = [fn1, fn2, fn3]

const results = arrayOfFunctions.map(execute)

or if you want to sequentially feed each functions result to the next:
compose(fn3, fn2, fn1)

compose 기본적으로 지원되지 않지만이 도구를 제공하는 ramda, lodash 또는 redux와 같은 라이브러리가 있습니다.


-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
문제는 객체가 아니라 함수 의 배열 에 관한 것이었다 .
trincot

-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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.