web-dev-qa-db-fra.com

Puis-je stocker des fonctions JavaScript dans des tableaux?

Comment puis-je stocker des fonctions dans un tableau avec des propriétés nommées, afin que je puisse appeler comme

FunctionArray["DoThis"]

ou même

FunctionArray[integer]

Remarque: je ne souhaite pas utiliser eval.

23
Emre

La chose importante à retenir est que les fonctions sont des objets de première classe en JavaScript. Vous pouvez donc les transmettre en tant que paramètres, les utiliser en tant que valeurs d'objet, etc. Les valeurs dans un tableau ne sont qu'un exemple de cela.

Notez que nous ne stockons pas les fonctions dans un tableau, même si nous pouvons le faire et y accéder avec un index numérique. Nous les stockons dans un objet régulier portant le nom avec lequel nous souhaitons accéder à cette fonction.

var functions = {
    blah: function() { alert("blah"); },
    foo: function() { console.log("foo"); }
};

appeler comme

functions.blah();

ou 

functions["blah"]();
31
Anurag

Vous voulez un littéral d'objet, pas un tableau.

x = { 'dothis': function() { alert('hi'); } };

Objet

x['dothis']()

Vous pouvez aussi invoquer dynamiquement

y = 'dothis';
x[y]()

Invocation statique/codée en dur:

x.dothis()

Si vous voulez cependant un tableau:

x = [function(){alert('hi');}][0]()
13
meder omuraliev

vous pouvez réellement le faire, déclarez-le simplement en dehors du tableau, comme si ...

const your_function = function(){ console.log( "I am your function" ) }

const group = [ 0, "lizard", false, your_function() ]

group[ 3 ]

vous pouvez aussi changer où il s'appelle, si vous voulez ...

const your_function = function(){ console.log( "I am your function" ) }

const group = [ 0, "lizard", false, your_function ]

group[ 3 ]()

EDIT: les fonctions ont été mal nommées:/sry

3
Fillipe Ogg

Vous pouvez même utiliser function comme nom de la propriété:

var func = function(a, b){alert(a+b)};
var obj = {};
obj[func] = 2;
2
Dmitry Masley

Vous pouvez accéder aux propriétés d'un objet par son nom (x ["A"]), si vous souhaitez affecter des index (0 = "A"), vous devez le faire, voici un exemple . (Je ne suis pas sûr que la boucle for fonctionnera sur n'importe quel navigateur, j'ai déjà testé sur Firefox, mais vous pouvez en avoir l'idée.)

var x = {};

x.A = function() { alert("func 1"); };
x.B = function() { alert("func 2"); };


var i = 0;
for (a in x)
{
    x[i] = x[a];
    ++i;
}


x[0](); // func 1
x[1](); // func 2
x["A"](); // func 1
x["B"](); // func 2
2
BrunoLM

Vous pouvez stocker des éléments directement dans un tableau, mais sous forme d'objet, par exemple:

var Functions = { DoThis: function() { alert("do this"); } };

Functions['DoThis'](); //alerts "do this"
Functions.DoThis()     //alerts "do this"

Vous pouvez essayer ici .

1
Nick Craver

Voici un tableau contenant divers types de données, y compris une fonction. 

Bien qu'il y ait un objet dans cet exemple, la fonction n'est pas dans l'objet. 

Si vous remplacez cet objet par une chaîne, la fonction fonctionnera toujours comme prévu.

Je peux appeler la fonction de l'intérieur ou de l'extérieur du tableau. 

myArray = [
        1,
        true,
        "String",
        {
            name: "trey",
            age: 43,
        },
        [1,2,3,4],
        myFunction = function(){
            console.log("whats up!");
        },
        myArray[5](),
    ];
    console.log(myArray);
    myArray[5]();

Voici la sortie:

whats up!
[ 1, true, 'String', { name: 'trey', age: 43 }, [ 1, 2, 3, 4 ], [Function], undefined ]
whats up!
1
Trey Brister

Fondamentalement, la fonction est un type spécial d’objet en javascript. Et en javascript, dans array vous pouvez tout stocker (pas nécessairement du même type). Donc, par là, oui! vous pouvez stocker une fonction, un objet, des valeurs primitives dans un tableau en javascript.

var arr = ["hello",true,false, 1, {name: "arshad"}, function(){}]

Et vous pouvez mélanger objet et fonction pour créer la fonction nommée comme:

{ callBythisname: function(){ .... }}

Vous pouvez également stocker cet objet dans un tableau

var arr = [{ callBythisname: function(){ .... }}];

Si vous voulez l'appeler, appelez comme ceci:

arr[0].callBythisname();
0
Arshad