Что произошло, когда движок JavaScript интерпретировал объектный литерал?

Недавно я попытался создать объект, используя литерал объекта. И мне нужно свойство, которое использует другое свойство в объекте. Как это

var object = {
    property1:'property1',
    property2:'property2 is from ' + this.property1
};
console.log(object.property2);// property2 is from undefined

this.property1 является undefined в property2,

Я знаю много способов справиться с этой проблемой. Мой вопрос: что происходит за кулисами? Другими словами, как движок JavaScript интерпретирует объектный литерал? Я знаю, что "подъем" происходит в функции. Происходит ли "подъем" в литерале объекта?

Благодарю.

1 ответ

Решение

Вот что происходит:

this относится к области, в которой работает ваш код.

Точно так же в этом коде:

var a = 42;

var o = {
    key: a
};

a определяется из текущей области, this ссылка в вашем коде разрешена this относится к "внешнему" литералу объекта. (цитаты с "outside" используются, так как нет никакого "внутри" или "снаружи" литерала - весь код выполняется в текущей области видимости).

Так что технически ваш код может быть преобразован в нечто вроде

var a = this;

var object = {
    property1:'property1',
    property2:'property2 is from ' + a.property1
};

или даже

var p = this.property1;

var object = {
    property1:'property1',
    property2:'property2 is from ' + p
};

так что некоторые особые свойства this тебя не смутило.

Другие вопросы по тегам