это. ссылается на Object вместо Window-Object

У меня есть объект, как показано ниже.

В строке 6 я пишу console.log(this.title, elem).

Теперь, согласно тому, что я узнал об этом.-ключевом слове, this.title не должен ссылаться здесь на текущий объект, а на глобальный объект-окно. Теперь, вопреки моему знанию, this.title, кажется, правильно ссылается на свойство видео-объекта.

const video = {
    title: "a",
    tags: ["a", "b", "c", "d"],
    showTags() {
        this.tags.forEach(elem => {
            console.log(this.title + ": ", elem)
        });
    }
}
video.showTags();

Вот что показывает Браузер:

a:  a
a:  b
a:  c

Я думал, что, поскольку console.log(this.title, elem) находится внутри функции обратного вызова, будет сделана ссылка на глобальный объект окна. Этот пост подтверждает мое мнение о том, что this.title должен фактически ссылаются на глобальный объект.

Может кто-нибудь объяснить?


person Josh    schedule 30.04.2019    source источник
comment
showTags является членом этого объекта.   -  person Daniel A. White    schedule 30.04.2019


Ответы (1)


Стрелочные функции лексически связывают свой контекст, поэтому это фактически относится к исходному контексту. Поскольку вы используете здесь функцию Arrow, значение this внутри метода forEach() указывает на лексическое окружение, в котором оно объявлено. Это внутри метода showTags(), поэтому он имеет то же значение this, что и showTags().

Если бы здесь не использовалась стрелочная функция, то значением this было бы окно, как в приведенном ниже фрагменте:

const video = {
    title: "a",
    tags: ["a", "b", "c", "d"],
    showTags() {
        this.tags.forEach(function(elem ) {
            console.log(this.title, elem)
        });
    }
}
video.showTags();

person amrender singh    schedule 30.04.2019
comment
Я только что попробовал, и действительно... функция arrow имеет значение. Я всегда думал, что стрелочная нотация — это просто вопрос улучшения синтаксиса. Благодарю вас! - person Josh; 30.04.2019
comment
@Josh Вы можете отметить принятый ответ галочкой, чтобы помочь другим найти лучшие ответы. - person FZs; 30.04.2019
comment
Я не понимал, что мне разрешено делать это как новичку. Только что сделал сейчас. - person Josh; 30.04.2019