В приведенном ниже коде, если я печатаю this.property2 на консоли, JS-движок печатает undefined, если я заменяю оператор для печати, компилятор property2 генерирует опорную ошибку. Если я объявлю переменную property2, то компилятор вернет undefined.
function foo() {
var property;
console.log(this.property2)
console.log(this.property2 === property2)
console.log(property2)
}
foo.property="property value";
var property2; // modified to resolve reference error
foo();
console.log(foo.property);
Как я показал в коде this.property2 равен свойству2, поэтому почему javascript ведет себя по-разному для одной и той же переменной.
Придя к моему вопросу, есть переменные (this.property2 и property2) разные? Если да, то почему сравнение возвращает true? Если нет, то почему я должен объявить свойство2, чтобы получить возвращаемое значение, и this.property2 возвращает значения без объявления.
Я что-то пропустил?
Почему чтение неопределенной переменной дает ссылочную ошибку, но свойство uneclared object возвращает undefined в javascript?
Это действительно сводится к тому, что Брендан Эйх решил, что он должен это делать при разработке этого материала. Но мы можем видеть некоторые причины, по которым он мог сделать эти выборы:
В первом случае у вас есть полностью неизвестный идентификатор. Во втором случае существует контекст: мы знаем, что мы ищем свойство объекта. Также обратите внимание, что мы можем присваивать неизвестное свойство без ошибок (это создает свойство, и это хорошо, потому что долгое время это был единственный способ создать свойство [если мы свободно принимаем инициализаторы свойств в инициализаторе объекта как назначение сортировок], теперь у нас есть Object.defineProperty
[который присваивает значение как часть процесса] и его множественный кузен и связанный с ним второй аргумент Object.create
), который хорошо балансирует балансы с возможностью читать неизвестное свойство без ошибок.
Он, конечно, мог бы прочесть неизвестное свойство от объекта ошибки, он просто не сделал этого; и теперь его не меняется. :-)
Обратите внимание, что в начале он назначил неизвестному идентификатору механизм для создания глобальной переменной. (!) Этот, к счастью, был зафиксирован строгим режимом.
Примечание: вы не объявляете свойства, вы их создаете. Объявляются только функции, классы (которые действительно являются функциями) и переменные.
Object.defineProperty
присваивает значение, но вы правы, я должен был упомянуть это. Геттеры здесь не актуальны.