Как получить доступ к переменной динамически внутри анонимной функции / замыкания?

#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. этого следует избегать… это немного медленнее