2010-08-28 11 views
22

¿Cómo puedo almacenar funciones en una matriz con las propiedades con nombre, por lo que se puede llamar como¿Puedo almacenar funciones de JavaScript en matrices?

FunctionArray["DoThis"] 

o incluso

FunctionArray[integer] 

Nota: que no desean utilizar eval.

+0

posible duplic comió de [JavaScript Array of Functions] (http://stackoverflow.com/questions/4908378/javascript-array-of-functions) –

Respuesta

11

Desea un objeto literal, no una matriz.

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

objeto

x['dothis']() 

También puede invocar dinámicamente

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

estático/invocación duro codificado:

x.dothis() 

Si usted quiere una matriz sin embargo:

x = [function(){alert('hi');}][0]() 
27

Lo importante es recordar que las funciones son objetos de primera clase en JavaScript. De modo que puede pasarlos como parámetros, usarlos como valores de objetos, etc. Los valores en una matriz son solo un ejemplo de eso.

Tenga en cuenta que no estamos almacenando las funciones en una matriz aunque podemos hacer eso y acceder a ellas con un índice numérico. Los estamos almacenando en un objeto regular marcado por el nombre con el que queremos acceder a esa función.

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

llamada como

functions.blah(); 

o

functions["blah"](); 
+0

¿Cómo puedo llamar a una función en esa matriz en otra función que también está en la matriz? – utdev

1

Puede almacenar las cosas directamente en una matriz, sino como un objeto, por ejemplo:

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

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

You can give it a try here.

+0

hmm .. ¡Gracias! ¿por qué esto no funcionaría? var FunctionArray = []; FunctionArray ["m +"] = function() {...} – Emre

+0

hmm funcionó cuando dije FunctionArray ["whatever"](); gracias de nuevo – Emre

+0

@Emre - Es una matriz, para que funcione, simplemente cree un objeto en su lugar usando 'var FunctionArray = {};' como la primera línea :) –

2

Puede acceder a las propiedades de un objeto a través de su nombre (x ["A"]), si desea asignar índices (0 = "A"), tiene que hacer esto, here is a example. (No estoy seguro de si el bucle for funcionará en cualquier navegador, he probado en Firefox, pero se puede conseguir la idea)

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 
+1

** No ** espere que 'x [0]' sea 'x.A' y' x [1] 'que sea' x.B' después de ese ciclo; 'for ... in' itera sobre las propiedades de un objeto en [un orden arbitrario] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in#Description). Pero puedes hacer algo como 'x [0] = x.A; x [0](); '. –

+0

¿Puedes reproducirlo? Supongo que el orden no es realmente arbitrario, depende del orden que usted haya definido. Al menos no puedo reproducir eso. – BrunoLM

+0

El orden no es "arbitrario" en el sentido de que las implementaciones de los navegadores tienden a ir en el orden en que se definieron. Pero esa es la decisión de implementación individual del navegador. Por especificación, un objeto literal no tiene un orden estricto. Entonces, aunque es probable que el código se ejecute sin artefactos negativos en el orden definido, no necesariamente DEPENDERÁ de él, porque un navegador puede cambiar su implementación, o un nuevo navegador podría entrar en la escena que no se implementa de esta manera. –

2

incluso se puede utilizar la función como el nombre de la propiedad:

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

Aquí hay una matriz que contiene varios tipos de datos, incluida una función.

Aunque hay un objeto en este ejemplo, la función no está dentro del objeto.

Si reemplaza este objeto con una cadena, la función seguirá funcionando según lo planeado.

Puedo llamar a la función desde dentro o fuera de la matriz.

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

Aquí está la salida:

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

en realidad se puede hacer eso, simplemente declarar fuera de la matriz, al igual que ...

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

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

group[ 3 ] 

también puede cambiar en donde está llamado, si desea ...

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

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

group[ 3 ]() 

EDITAR: las funciones se nombraron incorrectas:/sry

0

Básicamente la función es un tipo especial de Objeto en javascript. Y en javascript, en la matriz puede almacenar cualquier cosa (no necesariamente del mismo tipo). Así que, yendo por esto, ¡sí! puede almacenar una función, objeto, valores primitivos en una matriz en javascript.

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

Y usted puede mezclar objeto y función para realizar la función denominada como:

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

Puede almacenar este objeto en una matriz, así

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

Si desea llamar , llame al:

arr[0].callBythisname(); 
Cuestiones relacionadas