2011-12-25 12 views
6

Duplicar posible:
Javascript dynamic variable namecrear una nueva variable global única cada vez que se ejecuta una función en javascript

Una pregunta muy básica. Quiero crear una nueva variable global javascript cada vez que se llama a una función. La variable debe contener la identificación del elemento para que pueda acceder fácilmente más tarde.

id = 2347 

//this function would be called multiple times, hopefully generating a new global each time 
function (id) 
{ 
var + id = something 
// I want a variable that would be named var2347 that equals something, but the above line doesn't get it. 
} 

En una función más tarde, quiero acceder a la variable, así:

function two (id) 
{ 
alert(var + id); 
} 

Estoy seguro de que voy a tener un "Do!" momento en que alguien tiene la amabilidad de responder a esto.

+0

¿Quieres una nueva variable global o simplemente una variable global existente 'id' tener un nuevo valor? –

+0

Quiere * evitar * variables globales. Cree su propio espacio de nombres en su lugar ... –

+0

Simplemente haga que sea una matriz y escriba vars [12345] en lugar de vars12345. – Kos

Respuesta

6

¿Qué tal ...

var store = (function() { 
    var map = {}; 

    return { 
     set: function (name, value) { 
      map[ name ] = value; 
     }, 
     get: function (name) { 
      return map[ name ]; 
     } 
    }; 
})(); 

Uso:

store.set(123, 'some value'); 

y luego ...

store.get(123) // 'some value' 
store.get(456) // undefined 

Demostración en directo:http://jsfiddle.net/jZfft/

Los programadores están muy recomendable para no declarar variables globales, ya que los navegadores ya incluyen cientos de nombres en el espacio de nombres global. Usar el espacio de nombre global para sus propias variables puede llevar a colisiones de nombres que pueden romper el programa o algunas de las funciones del navegador. Crear nuevos espacios de nombres es gratis, así que no sea tímido para hacerlo ...

+0

+ 1 para el último párrafo, pero creo que esta solución es un poco exagerada. En lugar de una variable global 'map' estás creando una variable' store' global. Lo único que esto agrega es algo de azúcar sintáctica en mi opinión. – pimvdb

+0

@pimvdb Sí, es una especie de overkill. Esta es la forma más básica de este patrón. Se vuelve más útil cuando el comportamiento get/set es más complejo (cuando se deben ejecutar varios comandos) ... –

3

Puede guardar los valores de hash mundial:

var g = {}; 

function (id) 
{ 
    g[id] = something; 
} 

function two (id) 
{ 
    alert(g[id]); 
} 
4

Las variables globales son propiedades del objeto window, por lo window.lol y window['lol'] definir una variable global lol que se puede acceder en cualquiera de estas maneras. La segunda, window['lol'], también se puede utilizar con los nombres de variables, como esto:

var lol = 123; 
var name = 'lol'; 
var content = window[name]; // window['lol'] == 123 

content contendrá ahora 123. Casi cualquier cosa se puede poner entre corchetes [], por lo que también puede hacer esto:

var id = 123; 
window['prefix' + id] = 'text'; 
var content = window['prefix' + id]; // prefix123 == text 

O, en su caso:

var id = 2347; 
function one(id) { 
    window['var' + id] = something; 
} 
function two(id) { 
    alert(window['var' + id]); 
} 
+0

Creo que esto solo es cierto para algunas implementaciones de JS (como las de un navegador, pero no de Node.JS, por ejemplo, no hay 'ventana' allí). – Kos

+0

Oh, sí, me olvidé de Node y tal :(. Creo que node usa 'global' en lugar de ventana, no sé de los demás ... bueno podrías ir al dedo medio para codificar estándares y eval x]. –

2

Yo diría que realmente no desea hacer muchas variables globales. Por el contrario, puede hacer un objeto o matriz global y adjuntar todas sus otras variables a eso.En este caso, es probable que desee un objeto:

var myIds = {}; 

function makeSomething(id) { 
    // create something that goes with this id 
    myIds[id] = something; 
} 

Luego, para obtener esa información en un momento posterior, se puede recuperar con esto:

var something = myIds[id]; 

La razón de esta sugerencia es muchos- doblez. En primer lugar, quiere minimizar el número de variables globales porque cada global es una oportunidad para una colisión de nombres con algún otro script que pueda estar usando. En segundo lugar, al realizar un seguimiento de una gran cantidad de datos relacionados, es una mejor práctica de programación para mantenerlo en una estructura de datos específica en lugar de simplemente tirarlo todo en el contenedor global gigante con todos los demás datos.

Es incluso posible crear un objeto que maneja todo esto para usted:

function idFactory() { 
    this.ids = {}; 
} 
idFactory.prototype = { 
    makeSomething: function(id) { 
     // create something that goes with this id 
     this.ids[id] = something; 
    }, 
    retrieveSomething: function(id) { 
     return(this.ids[id]); 
    }, 
    clear: function() { 
     this.ids = {}; 
    } 
}; 

// then you would use it like this: 
var myIds = new idFactory(); 
myIds.makeSomething(2347); 
var value = myIds.retrieveSomething(2347); 
Cuestiones relacionadas