@MaxYenot

Почему не получается вызвать метод внутри другого метода в JavaScript?

Здравствуйте. Разбираюсь с функциями-конструкторами на Javascript.
Пишу небольшое приложение, которое просит ввести перевод.
Конструктор function SpellingTask(task, correct){} принимает два параметра - массивы task, correct.
Метод .ask() создает элементы формы, лейбла, кнопок и прикрепляет к body
Еще этот метод вызывает другой метод - .check(), который и должен проверять правильность введенного ответа.
Но не работает почему-то.Консоль Гугл Хрома выдает ошибку
Uncaught TypeError: this.check is not a function
at HTMLButtonElement. (spellingClass.html:43)

function SpellingTask(task, correct){
		this.counter = 0;
		this.task = task;
		this.correct = correct;
		this.userAnswer = "";
		this.check = function(){
			if(this.userAnswer === this.correct[this.counter]){
				console.log("Молодец");
				this.counter++;
				if(this.counter >= this.task.length){
					console.log("На этом спеллинг закончен. Тут можно вызвать другую функцию");
				}else{
					this.ask();
				}
			}else{
				this.ask();
			}
		};
		this.ask = function(){
			/*userAnswer = prompt("Напиши перевод слова '" + taskSpellingTask[taskSpellingCounter] + "'");*/
			var inputDiv = document.createElement("div");
				inputDiv.setAttribute("id", "inputDiv");
			var label = document.createElement("label");
				label.setAttribute("for", "inp");
				label.textContent = "Напиши перевод слова '" + this.task[this.counter] + "'";
			var input = document.createElement("input");
				input.setAttribute("id", "inp");
			var submit = document.createElement("button");
				submit.textContent = "Проверить";
				submit.addEventListener("click", function(){
					this.userAnswer = input.value;
					document.body.removeChild(inputDiv);
					this.check();
				});

			inputDiv.appendChild(label);
			inputDiv.appendChild(input);
			inputDiv.appendChild(submit);
			document.body.appendChild(inputDiv);

	tasks = [];
	tasks.push(new SpellingTask(['привет', 'до свидания'],['hello','good bye']))
	var task1 = new SpellingTask(['привет', 'до свидания'],['hello','good bye'])
  • Вопрос задан
  • 286 просмотров
Решения вопроса 1
@0x3a
submit.addEventListener("click", function(){}); замени на стрелочную функцию ()=>{}, и тогда контекст останется. Или можно использовать метод bind для указания контекста, иначе он будет браться по умолчанию, в данном случае это HTMLButtonElement
PS: если использовать typescript, то эта ошибка была бы сразу видна.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 23:00
5000 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект