Почему чтение необъявленной переменной дает ошибку ссылки, а необъявленное свойство объекта возвращает неопределенное в javascript?

1

В приведенном ниже коде, если я печатаю 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 возвращает значения без объявления.

Я что-то пропустил?

Теги:
this
javascript-objects

1 ответ

1

Почему чтение неопределенной переменной дает ссылочную ошибку, но свойство uneclared object возвращает undefined в javascript?

Это действительно сводится к тому, что Брендан Эйх решил, что он должен это делать при разработке этого материала. Но мы можем видеть некоторые причины, по которым он мог сделать эти выборы:

В первом случае у вас есть полностью неизвестный идентификатор. Во втором случае существует контекст: мы знаем, что мы ищем свойство объекта. Также обратите внимание, что мы можем присваивать неизвестное свойство без ошибок (это создает свойство, и это хорошо, потому что долгое время это был единственный способ создать свойство [если мы свободно принимаем инициализаторы свойств в инициализаторе объекта как назначение сортировок], теперь у нас есть Object.defineProperty [который присваивает значение как часть процесса] и его множественный кузен и связанный с ним второй аргумент Object.create), который хорошо балансирует балансы с возможностью читать неизвестное свойство без ошибок.

Он, конечно, мог бы прочесть неизвестное свойство от объекта ошибки, он просто не сделал этого; и теперь его не меняется. :-)

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


Примечание: вы не объявляете свойства, вы их создаете. Объявляются только функции, классы (которые действительно являются функциями) и переменные.

  • 0
    Tj Crowder, в некоторой степени согласен с вашим ответом, возможно, движки JS возвращают неопределенное значение, когда есть область действия или движок просто пытается найти свойства с контекстом в разных областях в зависимости от того, на что это указывает. Но присвоение значений - это не единственный способ создания свойства, функция /.объект Object.defineProperty (метод, если я должен его вызывать) может использоваться для создания свойств (включая теневое копирование). После того, как копать глубже я должен знать о геттер и сеттер, поглотитель, я сомневаюсь , что вызывает свойства с контекстом возвращения неопределенную скорее «Reference ошибка» .Но я ценю ваши answer.Thanks
  • 0
    @AkshayNaik: Хорошо, Object.defineProperty присваивает значение, но вы правы, я должен был упомянуть это. Геттеры здесь не актуальны.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню