Что, черт возьми, за «это»?
Так что же это" ? this ссылается на объект, который выполняется в текущей функции. Я собираюсь дать вам очень простой трюк, если эта функция является частью объекта. Мы вызываем эту функцию и метод правильно, поэтому, если эта функция является методом в объекте, она ссылается на сам объект. В противном случае, если это обычная функция, что означает, что она не является частью объекта, она ссылается на глобальный объект, который является объектом окна в браузерах и глобальным в узле.
const video = { title : 'a', play() { console.log (this) } };
В этом примере, поскольку play - это метод в видеообъекте, «This» ссылается на сам объект с тем же маркером.
Результат: {title: «a», play: ƒ}
Мы можем добавить метод позже в этот объект, и мы получим тот же результат. например, мы можем добавить сюда метод остановки и установить его как функцию.
const video = { title : 'a', play() { console.log (this) } }; video.stop = function () { console.log(this) }
Эта функция является методом в объекте, поэтому «this» ссылается на сам объект. вывод будет: {title: «a», play: ƒ, stop: ƒ}
Если эта функция является обычной функцией, что означает, что она не является частью объекта, «this» ссылается на глобальный объект, который является объектом окна в браузерах и глобальным в узле. поэтому давайте определим такую обычную функцию:
function playVideo () { console.log (this); }
Если вы зарегистрируете это в консоли, мы увидим глобальный объект, который является окном в браузерах и глобальным в узле.
вывод будет: Window {0: global, window: Window, self: Window, document: document, name: «, location: Location,…}
Приведенный ниже код является еще одним примером «этого».
function video (title ) { this.title = title; console.log (this) ; } const v = new video("a");
вывод будет: видео {название: «а»}
Но что здесь происходит? Давайте посмотрим . в этом примере мы используем новый оператор, который имеет место для связи функций конструктора с обычной функцией. при использовании оператора new этот оператор new создает новый пустой объект, подобный этому, и устанавливает его в этой функции-конструкторе так, чтобы он указывал на него.
Другой пример :
const video = { title ='a', tags =['a','b','c'], showTag(){ this.tags.foreach (function (function (tag) { console.log(this , tag); };) } }; video.showTag();
«This» в этом примере относится к окну, не должно ссылаться на видеообъект, потому что здесь мы находимся внутри этой функции обратного вызова. эта функция - обычная функция. это метод в видеообъекте. единственный метод, который у нас есть, - это showTags. поскольку это обычная функция, это относится к глобальному объекту. но как мы можем это решить?
мы должны передать эту функцию в качестве аргумента функции обратного вызова следующим образом:
const video = { title ='a', tags =['a','b','c'], showTag(){ this.tags.foreach (function (function (tag) { console.log(this.tags , tag); }; this ) } }; video.showTag();
Если вам понравился этот пост и он был полезен, пожалуйста, нажмите кнопку хлопать 👏 несколько раз, чтобы показать поддержку, спасибо.