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

Чтобы сохранить глобальное пространство имен в чистоте, мой код JavaScript обернут следующим образом:

(function() {
    /* my code */
})();

Теперь у меня есть несколько переменных, объявленных в этой области, к которым я хочу получить доступ, используя имя переменной переменной (например, имя 'something' + someVar). В глобальном масштабе я бы просто использовал window['varname'], но, очевидно, это не работает.

Есть ли хороший способ сделать то, что я хочу? Если нет, я мог бы просто поместить эти переменные в объект, чтобы использовать обозначение массива ...

Примечание: eval('varname') не является приемлемым решением. Поэтому, пожалуйста, не предлагайте это.

Ответы [ 3 ]

8 голосов
/ 05 февраля 2011

Это хороший вопрос, потому что this не указывает на анонимную функцию, иначе вы, очевидно, просто использовали бы this['something'+someVar].Даже использование устаревшего arguments.callee здесь не работает, потому что внутренние переменные не являются свойствами функции.Я думаю, что вам придется делать именно то, что вы описали, создавая объект-держатель ...

(function() {
  var holder = { something1: 'one', something2: 2, something3: 'three' };

  for (var i = 1; i <= 3; i++) {
    console.log(holder['something'+i]);
  }
})();
2 голосов
/ 05 февраля 2011
(function(globals) {
    /* do something */
    globals[varname] = yourvar;
})(yourglobals);
1 голос
/ 05 февраля 2011

злое решение / хак: Поместите нужную переменную в вспомогательный объект obj и избегайте необходимости менять текущее использование в точечную нотацию с помощью использования с (obj) { ваш текущий код ...}

...