Как создать динамические имена переменных внутри цикла? - PullRequest
46 голосов
/ 24 ноября 2011

Я работаю над скриптом ajax google maps и мне нужно создать динамические имена переменных в цикле for.

for (var i = 0; i < coords.length; ++i) {
    var marker+i = "some stuff";
}

Что я хочу получить: marker0, marker1, marker2 и так далее. и я думаю, что-то не так с marker+i

Firebug дает мне это: missing ; before statement

Ответы [ 6 ]

88 голосов
/ 24 ноября 2011

Используйте для этого массив.

var markers = [];
for (var i = 0; i < coords.length; ++i) {
    markers[i] = "some stuff";
}
43 голосов
/ 24 ноября 2011

Я согласен, что для этого обычно предпочтительнее использовать Array.

Однако это также можно сделать в JavaScript, просто добавив свойства в текущую область ( глобальная область * 1005)*, если код верхнего уровня; область действия функции , если внутри функции), просто используйте this - что всегда относится к текущей области действия.

for (var i = 0; i < coords.length; ++i) {
    this["marker"+i] = "some stuff";
}

Вы можете позжеполучить сохраненные значения (если вы находитесь в той же области действия, в которой они были установлены):

var foo = this.marker0;
console.log(foo); // "some stuff"

Эта немного странная особенность JavaScript используется редко (по уважительной причине), но в определенных ситуациях она может бытьполезно.

14 голосов
/ 21 мая 2013

Попробуйте это

window['marker'+i] = "some stuff"; 
3 голосов
/ 20 апреля 2017

Что касается итеративных имен переменных, мне нравится создавать динамические переменные, используя Шаблонные литералы .Каждый Том, Дик и Гарри используют стиль массива, что хорошо.Пока вы не работаете с массивами и динамических переменных, о боже!Перегрузка глаз кровью.Так как литералы шаблона сейчас имеют ограниченную поддержку, eval() - это еще один вариант.

v0 = "Variable Naught";
v1 = "Variable One";

for(i = 0; i < 2; i++)
{//console.log(i) equivalent is console.log(`${i}`)
  dyV = eval(`v${i}`);
  console.log(`v${i}`); /* => v0;   v1;  */      
  console.log(dyV);  /* => Variable Naught; Variable One;  */
}

Когда я пробирался через API, я сделал этот маленький фрагмент цикла, чтобы увидеть поведениев зависимости от того, что было сделано с литералами шаблона по сравнению, скажем, с Ruby.Мне больше нравилось поведение Руби;необходимость использовать eval() для получения значения выглядит неубедительно, когда вы привыкли получать его автоматически.

_0 = "My first variable"; //Primitive
_1 = {"key_0":"value_0"}; //Object
_2 = [{"key":"value"}]    //Array of Object(s)


for (i = 0; i < 3; i++)
{
  console.log(`_${i}`);           /*  var
                                   * =>   _0  _1  _2  */

  console.log(`"_${i}"`);         /*  var name in string  
                                   * => "_0"  "_1"  "_2"  */

  console.log(`_${i}` + `_${i}`); /*  concat var with var
                                   * => _0_0  _1_1  _2_2  */

  console.log(eval(`_${i}`));     /*  eval(var)
                                   * => My first variable
                                        Object {key_0: "value_0"}
                                        [Object]  */
}
1 голос
/ 20 апреля 2018

Вы можете использовать метод eval () для объявления динамических переменных.Но лучше использовать массив.

for (var i = 0; i < coords.length; ++i) {
    var str ="marker"+ i+" = undefined";
    eval(str);
}
0 голосов
/ 24 ноября 2012
 var marker+i = "some stuff";

можно интерпретировать так: создать переменную с именем marker (не определено); затем добавьте к i; затем попытайтесь присвоить значение результату выражения, невозможно . Firebug говорит вот что: маркер var; я = «кое-что»; это то, что firebug ожидает запятую после маркера и до меня; var является оператором и не (по-видимому) принимает выражения. Не очень хорошее объяснение, но я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...