#javascript #this #arrow-functions
#javascript #это #стрелка-функции
Вопрос:
Я пытаюсь вызвать элемент divRepo с помощью метода forEach(), но я в замешательстве из-за этого аргумента. Я могу использовать этот аргумент с функцией стрелки. Но я получаю неопределенный текст в качестве вывода, когда я использую этот аргумент с обычной функцией. можно ли вызвать divRepo с помощью обычной функции? Спасибо…
С помощью обычной функции
class UI {
constructor() {
this.divRepo = document.querySelector("#repos");
}
showUserRepositories(repos) {
repos.forEach(function (repo) {
console.log(this) //output : undefined
this.divRepo.innerHTML = `
<div class="mb-2 card-body">
<div class="row">
<div class="col-md-2">
<a href="${repo.html_url}" target = "_blank" id = "repoName" >${repo.name}</a>
</div>
</div>
</div>
`;
});
}
}
С помощью функции со стрелкой
class UI {
constructor() {
this.divRepo = document.querySelector("#repos");
}
showUserRepositories(repos) {
repos.forEach( (repo) => {
console.log(this) // output : UI {divRepo: div#repos}
this.divRepo.innerHTML = `
<div class="mb-2 card-body">
<div class="row">
<div class="col-md-2">
<a href="${repo.html_url}" target = "_blank" id = "repoName" >${repo.name}</a>
</div>
</div>
</div>
`;
});
}
}
Комментарии:
1. вы могли бы сохранить
this
_this
или использоватьbind
функцию, но какой в этом смысл? Просто используйте функцию со стрелкой.
Ответ №1:
Непонятно, почему вы не можете использовать функцию со стрелкой, поскольку она была разработана для решения проблем такого типа. Если по какой-либо причине вам нужно использовать функцию, отличную от стрелки, одним из вариантов является использование второго аргумента, для forEach
которого устанавливается this
контекст:
repos.forEach(function (repo) {
// ...
}, this);
Существуют и другие альтернативы, такие как захват ссылки this
в замыкании:
const that = this;
repos.forEach(function (repo) {
// ...
console.log(that);
});
…или привязать:
const processRepo = function (repo) {
// ...
};
repos.forEach(processRepo.bind(this));
Комментарии:
1. Я немного любопытный человек, я думал о том, какие есть другие решения… Спасибо Джейкобу