2011-12-25 3 views
6

Можно создать дубликат:
Javascript dynamic variable nameСоздание новой уникальной глобальной переменной каждый раз, когда функция выполняется в JavaScript

Очень простой вопрос. Я хочу создать новую глобальную переменную javascript каждый раз, когда вызывается функция. Переменная должна содержать идентификатор элемента, чтобы я мог легко получить к нему доступ позже.

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. 
} 

В более поздней функции, я хочу, чтобы получить доступ к переменной следующим образом:

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

Я уверен, что я буду иметь «Doh!» момент, когда кто-то достаточно любезен, чтобы ответить на это.

+0

Вы хотите новую глобальную переменную или просто существующую глобальную переменную 'id' иметь новое значение? –

+0

Вы хотите * избегать глобальных переменных. Создайте свое собственное пространство имен ... –

+0

Просто создайте массив и напишите vars [12345] вместо vars12345. – Kos

ответ

6

Как насчет ...

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

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

Использование:

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

, а затем ...

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

Живая демонстрация:http://jsfiddle.net/jZfft/

Программисты настоятельно рекомендуется, чтобы не объявлять глобальные переменные, поскольку браузеры уже отправили несколько сотен имен в глобальное пространство имен. Использование глобального пространства имен для ваших собственных переменных может привести к конфликтам имен, которые могут затем нарушить работу программы или некоторых функций браузера. Создание новых пространств имен является бесплатным, поэтому не стесняйтесь это делать ...

+0

+ 1 для последнего абзаца, но я думаю, что это решение немного переборщило. Вместо глобальной переменной 'map' вы создаете глобальную переменную' store'. Простое добавление - это, по-моему, синтаксический сахар. – pimvdb

+0

@pimvdb Да, это отчасти избыток. Это самая основная форма этого шаблона. Она становится более полезной, когда поведение get/set более сложное (когда нужно выполнить несколько команд) ... –

3

Вы можете сохранить значения глобальной хэш:

var g = {}; 

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

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

Глобальные переменные свойства window объекта, так и window.lolwindow['lol'] определить глобальную переменную lol, которые могут быть доступны в любой из этих способов. Второй window['lol'], также могут быть использованы с именами переменных, например:

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

content теперь будет содержать 123. Практически все, что может быть в квадратные скобки [], так что вы можете сделать это:

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

Или в вашем случае:

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

Я считаю, что это справедливо только для некоторых реализаций JS (например, в браузере, но не Node.JS, например, там нет «окна»). – Kos

+0

О да, я забыл про Node и т. Д. Я думаю, что узел использует 'global' вместо окна, не знаю о других ... ну, вы могли бы пойти средним пальцем в стандарты кодирования и eval x]. –

2

Я бы сказал, что вы действительно не хотите делать много глобальных переменных. Скорее всего, вы можете просто создать один глобальный объект или массив и приложить к нему все другие переменные.В этом случае, вы, вероятно, хотите объект:

var myIds = {}; 

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

Затем, чтобы извлечь эту информацию в какое-то время спустя, вы можете получить его с этим:

var something = myIds[id]; 

Причиной этого предложения является многочастичной фолд. Во-первых, вы хотите свести к минимуму количество глобальных переменных, потому что каждый глобальный - это вероятность столкновения имен с другим скриптом, который вы можете использовать. Во-вторых, отслеживая совокупность связанных данных, лучше придерживаться практики программирования, чтобы сохранить ее в одной конкретной структуре данных, а не просто бросать ее в гигантский глобальный ящик со всеми другими данными.

Можно даже создать объект, который управляет все это для вас:

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); 
Смежные вопросы