Вызов метода внутри другого метода в javascript?
Теперь, когда я выполняю такой код, он выдает TypeError: this.C не является функцией. Может кто-нибудь сказать мне, почему это так. Я знаю, что это связано с лексическим охватом, но не могу этого понять.
Извините, я новый пользователь и задал первый вопрос, не знаю, как задавать вопросы. Я буду иметь это в виду теперь вперед. Спасибо. — Ashish Jain
4 ответы
Я думаю, что проблема в том, что когда this.C() выполняется внутри функции, на которую ссылается B , this относится к объекту, который содержит B , то есть объект A . (Это предполагает B() вызывается в контексте A )
Проблема в, C не существует на объекте A , так как он определен внутри B . Если вы хотите вызвать локальную функцию C() в B , просто используйте C() .
РЕДАКТИРОВАТЬ: Кроме того, я не уверен, что то, что вы опубликовали, является допустимым JavaScript. Конкретно, B должен быть определен таким образом, поскольку вы не можете использовать синтаксис объект: свойство внутри функции.
B: function() < var test='test'; var result='t1'; var C = function() < this.test='test1'; return 'test1'; >result=C(); return result; >
Я думаю, что вы правы, и я, наконец, сделал то же самое (создал функцию и вызвал ее непосредственно из внешней функции) после того, как ударился головой, чтобы заставить this.C работать. — Ашиш Джайн
Вы должны быть осторожны, когда используете это чтобы идентифицировать что-либо в Javascript, потому что каждый раз, когда вы меняете область действия, «это» меняется.
Присвоение ссылки this собственной переменной помогает обойти это.
var a = new function() < var self = this; self.method = function() < alert('hiya'); >; var b = function() < this.method(); // this isn't 'a' anymore? self.method(); // but 'self' is still referring to 'a' >; >;
Изучаю ООП JavaScript. Метод в методе?
Всем привет. Потихоньку начинаю вникать в ООП JavaScript (в самом JS тоже относительно недавно), решил написать свой слайдер. Сам код:
window.addEventListener('DOMContentLoaded', () => < //slider let portfolioSlider = document.querySelector('.portfolio-slider__wrap'); //главный контейнер слайдера //Если слайдер есть на странице if (portfolioSlider) < class PortfolioSlider < constructor (autoSlide = 'auto') < let sliderItem = portfolioSlider.querySelectorAll('.slider__item'); // получаем одиночные слайды this.numberSlides = sliderItem.length; this.autoSlide = autoSlide; >//генерируем точки навигации createNavDots () < if (this.numberSlides !== 1) < let sliderDots = portfolioSlider.querySelector('.slider__dots'); //контейнер с точками навигации for (let i = 0; i < this.numberSlides; i++) < let singleDots = document.createElement('span'); singleDots.classList.add('single-dot'); if (i === 0) < singleDots.classList.add('active'); >sliderDots.insertAdjacentElement('beforeend', singleDots); > > > //управление слайдами slidesNavigation () < if (this.numberSlides !== 1) < let sliderDots = portfolioSlider.querySelectorAll('.single-dot'), sliderItems = portfolioSlider.querySelector('.slider__items'), indexItemPrev = 0, indexItem = 0, nextSlide = portfolioSlider.querySelector('.next-slide'), prevSlide = portfolioSlider.querySelector('.prev-slide'), slidePosition = 0; if (this.autoSlide === 'auto') < setInterval(() => < indexItem += 1; slidePosition += 100; if (indexItem >this.numberSlides-1 || slidePosition > (this.numberSlides-1) * 100) < indexItem = 0; slidePosition = 0; >sliderItems.style.transform = 'translateX(-'+ slidePosition +'%)'; sliderDots[indexItemPrev].classList.remove('active'); indexItemPrev = indexItem; sliderDots[indexItem].classList.add('active'); >, 2000); > //отображаем полосы навигации nextSlide.style.display = 'block'; prevSlide.style.display = 'block'; //обрабатываем клик по точкам навигации sliderDots.forEach(function (item) < item.addEventListener('click', () =>< let parentItem = item.parentNode; indexItem = Array.prototype.indexOf.call(parentItem.children, item); slidePosition = indexItem * 100; sliderItems.style.transform = 'translateX(-'+ slidePosition +'%)'; sliderDots[indexItemPrev].classList.remove('active'); indexItemPrev = indexItem; sliderDots[indexItem].classList.add('active'); >); >); //обрабатываем клик по стрелкам вперед/назад prevSlide.addEventListener('click', () => < indexItem -= 1; slidePosition -= 100; if (indexItem < 0 || slidePosition < 0) < indexItem = this.numberSlides-1; slidePosition = (this.numberSlides-1) * 100; >console.log(slidePosition); sliderItems.style.transform = 'translateX(-'+ slidePosition +'%)'; sliderDots[indexItemPrev].classList.remove('active'); indexItemPrev = indexItem; sliderDots[indexItem].classList.add('active'); >); nextSlide.addEventListener('click', () => < indexItem += 1; slidePosition += 100; if (indexItem >this.numberSlides-1 || slidePosition > (this.numberSlides-1) * 100) < indexItem = 0; slidePosition = 0; >sliderItems.style.transform = 'translateX(-'+ slidePosition +'%)'; sliderDots[indexItemPrev].classList.remove('active'); indexItemPrev = indexItem; sliderDots[indexItem].classList.add('active'); >); > > > //создаем экземпляр слайдера const portfolioMainSlider = new PortfolioSlider('auto'); portfolioMainSlider.createNavDots(); portfolioMainSlider.slidesNavigation(); > >);
Строго не судите, в JS совсем недавно, реализовал как мог (но, конечно, от конструктивной критики не откажусь) 🙂 Вопрос в следующем. Есть метод slidesNavigation, в котором отслеживает клику по кнопкам навигации и в зависимости от индекса переключаются слайды. В каждом обработчике клика есть кусок кода вида:
sliderDots[indexItemPrev].classList.remove('active'); indexItemPrev = indexItem; sliderDots[indexItem].classList.add('active');
Это фрагмент повторяется в каждом обработчике и было бы логично вынести его в отдельный метод класса и вызывать внутри метода slidesNavigation, но так похоже сделать нельзя.
Помогите, пожалуйста, разобраться в этом вопросе. Заранее спасибо!
Средний 8 комментариев
Как вызвать метод в методе js?
Чтобы вызвать метод А из метода Б, объявленного в том же объекте, нужно к методу A обратиться через ключевое слово this , которое укажет нам на текущий объект с методом A:
class Methods firstMethod() return 'метод вызван'; > secondMethod() // обратимся к методу firstMethod() из метода secondMethod() return `Этот $this.firstMethod()> из другого метода!`; > > // создаем объект const method = new Methods(); // проверяем, что всё работает console.log(method.secondMethod()); // => Этот метод вызван из другого метода!
Почему не получается вызвать метод внутри другого метода в 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'])
Простой 1 комментарий