Отримати глобальну змінну динамічно за рядком імені в JavaScript


77
<script>
//in one script
var someVarName_10 = 20;
</script>

Я хочу отримати доступ до цієї змінної з іншого сценарію за назвою змінної. Якщо об'єкт вікна простий, чи можливо це за допомогою локальної змінної?

Я маю на увазі доступ до цього варіанта за допомогою такого коду:

<script>
  alert(all_vars['someVar' + 'Name' + num]);
</script>

1
Ваш зразок показує глобальну змінну. Ви хочете знати, чи можете ви отримати доступ до нього з локальної області?
Crescent Fresh

Це насправді залежить від того, що ви маєте на увазі під словом "локальний обсяг". Функції Javascript діють лише на функції, а не на блоки або навіть на файли
K Prime

Відповіді:


112

Ви хочете зробити щось подібне?

<script>
//in one script
var someVarName_10 = 20;

alert(window["someVarName_10"]); //alert 20

</script>

Оновлення : оскільки OP відредагував питання.

<script>
  num=10;
  alert(window['someVar' + 'Name_' + num]); //alert 20
</script>

вибачте, я помилився, я думав, що варів немає у вікні, дякую
appqui-platform

8
Мені байдуже, що насправді хотів ОП . Я дбаю про те, про що йде мова, і тому стає результатом пошуку в Google.
Томаш Зато - відновити Моніку

Що робити, якщо змінною є об’єкт , а я хочу внутрішній об’єкт ? наприклад var a = {name: "ABC"}. Тут window["a.name"]не вийде. Будь-які обхідні шляхи?
Діпак Чаудхарі

1
@DeepakChaudhary, можливо, ти хочеш щось на зразок _.get лодаша? - lodash.com/docs#get
ВАС

2
Це буде window ["a"]. Name;
Репо

44

Я помітив, що всі радять глобальне створення змінної, що призведе до витоку змінних до глобального простору імен. Коли ви динамічно створюєте назви класів або просто змінні, їх легко зберегти локальними:

this['className'] = 123;

або

this['varName'] = 123;

Інтервал між назвами буде виглядати так:

vars = {};
vars['varName'] = 123;
vars.varName // 123

1
var this['className'] = 123;для мене виглядає як синтаксична помилка.
Фелікс Клінг,

1
Це краще, ніж прийнята відповідь. Більш наочно про те, як ця функція працює в областях занять.
Sellorio

12
<script>
    var someVarName_10 = 20;
    var num = 10;
    alert(eval('someVar' + 'Name_' + num)); //alert 20
</script>

evalпрацював краще для мене! але використовуйте його з обережністю
papaiatis

1

ну, лише з метою налагодження ви можете зробити щось подібне. Я використовую його під час розробки класів, де деякі змінні повинні залишатися приватними (var). ця робота навіть у локальній змінній (і глобальній проклятті)

function MYCLASS(){
    var a=1, b=2, c=3;
    this.public = "variable";
    this.debug = function(sVar){
        return eval(sVar);
    }
}

var myThing = new MYCLASS();
myThing.debug('a') //return 1
myThing.debug('b') //return 2
myThing.debug('c') //return 3

0

Це не моя власна відповідь, відповідь Артура Араухо , але я думаю, що це стосується тут.


Альтернатива Eval:

exp = '1 + 1'
x = Function('return ' + exp)()
console.log(x)

-7

Якщо це те, що ви сказали:

<script type="text/javascript">
var hello = 'test';
</script>
<script type="text/javascript">
  alert (hello);
</script>

Це працює, оскільки сценарій, нарешті, доступний для документа, і ви можете отримати доступ до їх змін.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.