Javascript mảng chức năng


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

Điều đó không hoạt động như dự định vì mỗi chức năng trong mảng được thực thi khi mảng được tạo.

Cách thích hợp để thực hiện bất kỳ chức năng nào trong mảng bằng cách thực hiện:

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

Cảm ơn!


1
'a string'cần phải biết tại thời điểm mảng được điền, hoặc người gọi hàm có thể vượt qua nó không?
Lưỡi liềm tươi

Tôi muốn biết thêm chi tiết về những gì bạn đang cố gắng thực hiện, bởi vì có thể có cách xử lý việc này tốt hơn.
Jeff

2
"Mảng hàm" - hoặc như chúng ta muốn gọi nó là một đối tượng với các phương thức
symcbean

Bạn không nghĩ rằng bạn nên cung cấp thêm chi tiết? Có thể có một cách tốt hơn để xử lý việc này ..
IcyFlame

Câu trả lời:


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

và sau đó khi bạn muốn thực thi một hàm đã cho trong mảng:

array_of_functions[0]('a string');

16
Mẹo: Hãy nhớ đặt ()sau array_of_functions[0], ngay cả khi nó trống. Tôi dành 20 phút chỉ để tìm "tại sao nó không hoạt động".
Horacio

Làm việc như quyến rũ!
Moses Ndeda

Làm thế nào bạn có được chỉ mục của một hàm bằng cách chuyển một giá trị chuỗi như 'FirstFactor' để nó có thể động?
O'Dane Brissett

106

Tôi nghĩ rằng đây là những gì các poster ban đầu có nghĩa là để thực hiện:

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

Hy vọng rằng điều này sẽ giúp những người khác (như tôi 20 phút trước :-) tìm kiếm bất kỳ gợi ý nào về cách gọi các hàm JS trong một mảng.


3
Đây chỉ là những gì tôi cần, vì nó cho phép tôi thay đổi các cuộc gọi tham số, giả sử các chức năng của tôi không có cùng tham số: P
Jem

24

Không có nhiều chi tiết hơn về những gì bạn đang cố gắng thực hiện, chúng tôi đang đoán. Nhưng bạn có thể thoát khỏi việc sử dụng ký hiệu đối tượng để làm một cái gì đó như thế này ...

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

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

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

và gọi một trong số họ ...

myFuncs.firstFunc('a string')

1
Tôi nghĩ rằng điều này thân thiện với nhà phát triển hơn vì chúng ta không cần phải nhớ chỉ số chức năng. Ngoài ra, nếu chúng ta muốn đẩy bất kỳ chức năng nào vào chỉ mục cụ thể thì điều đó gây ra sự thay đổi chỉ mục của tất cả các chức năng bên cạnh nó. Vì vậy, sử dụng tốt hơn
dd619

16

Hoặc chỉ:

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

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

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

13

Tôi sẽ bổ sung chủ đề này bằng cách đăng một cách dễ dàng hơn để thực thi các chức năng khác nhau trong một mảng bằng cách sử dụng shift()phương thức Javascript được mô tả ban đầu ở đây

  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

Về cơ bản nó giống như Darin Dimitrov'snhưng nó cho thấy cách bạn có thể sử dụng nó để tự động tạo và lưu trữ các hàm và đối số. Tôi hy vọng nó hữu ích cho bạn :)

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
Sẽ tốt hơn nếu thêm câu trả lời của bạn cho dù có bao nhiêu người khác. Nhưng tốt hơn là thêm một số lời giải thích về sự khác biệt / tốt hơn về nó so với những điều khác
Bowdzone

3

ở trên chúng tôi thấy một số với lặp đi lặp lại. Hãy làm điều tương tự bằng cách sử dụng 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

Chính xác

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
Bạn có chắc chắn rằng đây là câu hỏi mà bạn muốn trả lời không? Nó không liên quan.
Bergi

1
@Bergi Thật ra là vậy. Thay thế câu trả lời operabằng array_of_functionsvà bạn đã có điều tương tự. Làm thế nào bây giờ?
Jesse

@Jlie cảm ơn, bây giờ tôi có một ý tưởng với việc đăng mã, đây là phản hồi đầu tiên của tôi.
Leonardo Ciaccio

Nhưng OP đã có một mảng, trong khi đây là một số đối tượng (có tên thuộc tính lẻ)? Và những tin tức về câu trả lời này là gì, tại sao không nâng cấp pjcabrera hay Robin?
Bergi

1
tên khó hiểu của biến. Đó không phải là một loạt các chức năng mà là một đối tượng của các chức năng
Craicerjack

1

Nếu bạn đang làm một cái gì đó như cố gắng tự động chuyển các cuộc gọi lại, bạn có thể chuyển một đối tượng làm đối số. Điều này cho phép bạn kiểm soát nhiều hơn các chức năng mà bạn muốn thực hiện với bất kỳ tham số nào.

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

Thực thi nhiều chức năng thông qua một cuộc gọi lại ES6

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

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


0

Có lẽ nó có thể giúp cho một ai đó.

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

Một cách ngắn để chạy tất cả:

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

0

vấn đề của các mảng hàm này không nằm ở "dạng mảng" mà theo cách các hàm này được gọi là ... thì ... hãy thử điều này .. với một 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] ); }

nó làm việc ở đây, nơi không có gì thượng lưu đang làm công việc ở nhà ... hy vọng nó sẽ giúp


Bạn có thể giải thích tại sao các câu trả lời khác không phù hợp với bạn và tại sao câu trả lời của bạn không? Cảm ơn bạn!
Fabio nói Phục hồi lại

nó không bao giờ trả lại cho tôi các chức năng, chức năng không xác định hoặc chúng không được đánh giá cao bởi javascript ... (tại sao tôi không biết, nhưng điều này đã giải quyết vấn đề của tôi)
Quetzal

1

vâng, khủng khiếp, như mọi khi, nhưng giải pháp bắn, và khá dễ sử dụng, đặc biệt nếu cách xa "đầu vào" ... ở đây, nó chỉ giải quyết được một lỗi không thể sử dụng javascript bên trong một cách ngắn gọn ...
Quetzal

0

Sử dụng 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

Tôi có nhiều vấn đề khi cố gắng giải quyết vấn đề này ... đã cố gắng rõ ràng, nhưng không hiệu quả. Nó chỉ nối một chức năng trống nào đó.

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

Tôi đã giải quyết nó bằng cách sử dụng một chuỗi các chuỗi và sau đó bằng eval:

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

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

-1

bạn có một số câu trả lời hàng đầu ở trên. Đây chỉ là một phiên bản khác của điều đó.

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

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

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

}


2
Câu hỏi là cho một loạt các chức năng, không phải là một đối tượng.
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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.