Производственные имена переменных - PullRequest
1 голос
/ 18 февраля 2011

Я всегда сталкиваюсь с ситуациями в программировании, когда я хочу иметь набор переменных, определенных в цикле (например, soldierA, soldierB, soldierC, ...) и назначать их определенным объектам.

someClassA = Ext.extend(someClassB) {
    initComponent {
        this.weekdays = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
                          'Friday', 'Saturday','Sunday' 
                        ];
        for(var i = 0; i<7; i++) {
            var dummy = "this.vacation" +this.weekdays[i]; 
            dummy = 1;
        };
        console.log("I desire the following to be a 1: " +this.vacationMonday);
    }
} 

Консоль перечисляет неопределенные элементы.

Какой рекомендуемый курс действий?

Ответы [ 3 ]

4 голосов
/ 18 февраля 2011

Вы должны использовать скобочные обозначения для установки имен динамических переменных. Также обратите внимание, что вы должны назначить напрямую, а не так, как указано в списке.

this["vacation" + this.weekdays[i]] = 1;
2 голосов
/ 18 февраля 2011

Я настоятельно рекомендую сделать это по-другому.Вы пытаетесь заставить свой код работать определенным образом, а не структурировать его естественным образом.Я бы предложил сделать это следующим образом:

someClassA = Ext.extend(someClassB) {
    initComponent {
        this.weekdays = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
                          'Friday', 'Saturday','Sunday' 
                        ];
        this.vacations = {};
        for(var i = 0; i < weekdays.length; i++) {
            vacations[this.weekdays[i]] = 1;
        };
        console.log("I desire the following to be a 1: " +this.vacations['Monday']);
    }
} 

Он использует объект vacations для индексации дней по имени вместо набора несвязанных переменных.

Кроме того, когда вы пишете var dummy = "this.vacation" +this.weekdays[i]; dummy = i, ты не делаешь то, что думаешь.Я разбью его здесь:

var dummy =: это объявляет переменную с именем "dummy" и присваивает ей объект после знака равенства.

"this.vacation": Это строкасодержащие буквы т ч i с . v a с а т я о п .Это просто те буквы - это не код, и он определенно не имеет доступа к this.vacation.

+this.weekdays[i];: это добавляет значение this.weekdays[i] к только что созданной строке.В целом, теперь у нас есть строка типа «this.vacationMonday».Опять же, это всего лишь серия букв - это не код.

dummy = 1;: это отбрасывает созданную нами строку и присваивает число 1 dummy.

0 голосов
/ 18 февраля 2011

с var dummy = "this.vacation" +this.weekdays[i]; вы на самом деле просто объединяете строки, то, что вы хотите, чтобы оно получало доступ к свойству объектов и добавляло к нему динамические свойства, и единственный способ сделать это, как сказал Мэтт Кинг с помощью обозначения с пробелами.

Это работает, потому что свойства объекта в Javascript могут быть доступны с точечной нотацией или как классические хеш-карты с скобочной нотацией. Попробуйте следующий код, например.

var myObj = {
    property1: 'One',
    property2: 'Two',
    property3: 'Three'
}

document.write(myObj.property1);
document.write(myObj['property2']);
document.write(myObj['property' + 3]);

http://jsfiddle.net/gxy53/

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