Почему for (... in ...) l oop не возвращает ключ при итерации через метод объекта - PullRequest
1 голос
/ 14 июля 2020

Почему, когда я запускаю employee.report () в этом методе объекта, я получаю предупреждения для «Undefined is John Smith» и т. Д. c.

var employee = {
    name: "John Smith",
    job: "Programmer",
    age: 31,
    report: function() {
        for (k in employee) {
            alert(this.k + " is " + employee[k])
        }
    }
}

, но когда я запускаю l oop такая консоль

for (k in employee) {
    alert(this.k + " is " + employee[k])
}

она возвращает правильные предупреждения («имя - Джон Смит» и т. Д. c.)

Ответы [ 4 ]

1 голос
/ 14 июля 2020

Для доступа к k вы должны использовать k вместо this.k. поэтому замените alert(this.k+ " is " +employee[k]) на alert(k+ " is " +employee[k]), тогда ваш код будет работать успешно.

Ссылки для понимания этого в js.

  1. w3schools
  2. mozilla
  3. geeksforgeeks
0 голосов
/ 14 июля 2020

@ Бармар очень хорошо объяснил, я просто добавляю больше деталей

В вашем методе объекта report

this in this.k указывает на employee объект, и вы получаете Undefined, потому что employee не имеет свойства с именем k. Вместо этого вы должны использовать this[k].

И в te l oop за пределами объекта

for (k in employee){
  alert(this.k+ " is " +employee[k])
}

this в this.k указывает на глобальный объект Window Фактически ваш код is

for (var k in employee){
  alert(this.k+ " is " +employee[k])
}

k станет глобальной переменной. this.k совпадает с window.k или k

Кстати: вы должны использовать const / let и use strict для более ясного понимания вашей переменной

0 голосов
/ 14 июля 2020

В функции report this - это объект employee, который не имеет свойства k. Итак, this.k - это undefined. Если вы хотите распечатать имя свойства, просто используйте k:

alert(k + " is " + employee[k]);

Вне функции this - это глобальный объект window. Глобальные переменные автоматически становятся свойствами window, поэтому this.k совпадает с k.

0 голосов
/ 14 июля 2020

Поскольку вы не определили employee в области видимости переменной employee, вы должны использовать ключевое слово this для ссылки на сам объект.

var employee = {
  name: "John Smith",
  job: "Programmer",
  age: 31,
  report: function(){
      for (k in this){
          alert(k+ " is " +this[k])
      }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...