Ответ 1
Используйте массив для этого.
var markers = [];
for (var i = 0; i < coords.length; ++i) {
markers[i] = "some stuff";
}
Я работаю над картами ajax google script, и мне нужно создать имена динамических переменных в цикле for.
for (var i = 0; i < coords.length; ++i) {
var marker+i = "some stuff";
}
Я хочу получить: marker0
, marker1
, marker2
и т.д.
и я думаю, что что-то не так с marker+i
Firebug дает мне это: missing ; before statement
Используйте массив для этого.
var markers = [];
for (var i = 0; i < coords.length; ++i) {
markers[i] = "some stuff";
}
Я согласен, что для этого обычно предпочтительнее использовать Array
.
Однако это также может быть достигнуто в JavaScript, просто добавляя свойства в текущую область (глобальную область, если код верхнего уровня; область функции, если внутри функции), просто используя this
- который всегда ссылается на текущую область.
for (var i = 0; i < coords.length; ++i) {
this["marker"+i] = "some stuff";
}
Позже вы можете извлечь сохраненные значения (если вы находитесь в той же области, в которой они были установлены):
var foo = this.marker0;
console.log(foo); // "some stuff"
Эта немного странная особенность JavaScript используется редко (по уважительной причине), но в определенных ситуациях она может быть полезна.
Попробуйте это
window['marker'+i] = "some stuff";
Что касается имен итеративных переменных, мне нравится делать динамические переменные, используя литералы шаблонов. Каждый Том, Дик и Гарри используют стиль массива, и это прекрасно. Пока вы не работаете с массивами и динамическими переменными, о мальчик! Перегрузка глаз. Поскольку литералы Template имеют ограниченную поддержку прямо сейчас, 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. Мне больше нравилось поведение 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] */
}
Вы можете использовать метод eval() для объявления динамических переменных. Но лучше использовать массив.
for (var i = 0; i < coords.length; ++i) {
var str ="marker"+ i+" = undefined";
eval(str);
}
<script>
var markers=[];
for (var i=0; i<5; ++i){
window['m'+i]=i;}
alert(m1);
alert(m2);
alert(m3);
</script>
var marker+i = "some stuff";
coudl интерпретироваться так: создать переменную с именем marker (undefined); затем добавьте к i; затем попытайтесь присвоить значение результату выражения, невозможно. Что говорит этот firebug: var marker; я = 'некоторые вещи'; это то, что firebug ожидает запятую после маркера и до i; var - это утверждение и не принимает (по-видимому) выражения. Не очень хорошее объяснение, но я надеюсь, что это поможет.