#javascript #javascript-objects
#javascript #замыкания #динамические переменные
Вопрос:
Чтобы сохранить глобальное пространство имен чистым, мой код JavaScript упакован следующим образом:
(function() {
/* my code */
})();
Теперь у меня есть некоторые переменные, объявленные в этой области, к которым я хочу получить доступ, используя переменную имя переменной (например, имя есть 'something' someVar
).
В глобальной области я бы просто использовал window['varname']
, но, очевидно, это не работает.
Есть ли хороший способ сделать то, что я хочу? Если нет, я мог бы просто поместить эти переменные внутри объекта, чтобы использовать обозначение массива…
Примечание: eval('varname')
это неприемлемое решение. Поэтому, пожалуйста, не предлагайте этого.
Комментарии:
1. Не могли бы вы более конкретно сказать, что вы хотите сделать, когда хотите «получить к ним доступ динамически»? Вы хотите получить к ним доступ вне функции? Это невозможно AFAIK.
2. Нет, я просто хочу получить к ним доступ без жесткого кодирования имени переменной — но изнутри моей функции.
3. «Динамически» — какую область вы имеете в виду?
4. Под «динамически» я имею в виду динамически генерируемое имя переменной.
Ответ №1:
Это хороший вопрос, потому this
что не указывает на анонимную функцию, иначе вы, очевидно, просто использовали this['something' someVar]
бы. Даже использование устаревшего arguments.callee
здесь не работает, потому что внутренние переменные не являются свойствами функции. Я думаю, вам нужно будет сделать именно то, что вы описали, создав объект holder …
(function() {
var holder = { something1: 'one', something2: 2, something3: 'three' };
for (var i = 1; i <= 3; i ) {
console.log(holder['something' i]);
}
})();
Ответ №2:
(function(globals) {
/* do something */
globals[varname] = yourvar;
})(yourglobals);
Комментарии:
1. «Чтобы сохранить глобальное пространство имен чистым» — так что, очевидно, я не хочу добавлять его в глобальное пространство имен.
2. @ThiefMaster:
globals
не обязательно означает глобальное пространство имен — здесь это просто параметр, и вполне может быть вашим собственным пространством имен. Это не заслуживает -1.3. Первоначальный ответ предлагал только
window[varname] = yourvar;
Ответ №3:
злое решение / хак: поместите нужную вам переменную во вспомогательный объект obj и избегайте необходимости изменять текущее использование на точечную нотацию, используя use with(obj){ ваш текущий код …}
Комментарии:
1. этого следует избегать… это немного медленнее