Почему моя оперативная память перегружается, когда я запускаю функцию javascript?

#javascript #browser

Вопрос:

Итак, у меня есть веб-сайт для поиска фильмов с помощью API фильмов, и я пытаюсь сделать нумерацию страниц для перехода между различными страницами API. Пагинация: введите описание изображения здесь

Функция для извлечения URL-адреса, внутри которой я сделал функцию foreach для нажатия на различные элементы li:

 function fetchURL(url){  lastUrl = url;  fetch(url)  .then(res =gt; res.json())  .then(data =gt;{  trendingMovies(data.results);  currentPage = data.page;  nextPage = currentPage   1;  prevPage = currentPage - 1;  totalPages = data.total_pages;  lastPage = totalPages;   if(currentPage lt;= 1){  prev.classList.add('disabled');  next.classList.remove('disabled');  }  else if(currentPage gt;= lastPage){  prev.classList.remove('disabled');  next.classList.add('disabled');  }else{  prev.classList.remove('disabled');  next.classList.remove('disabled');  }  [].forEach.call(liTag,function(el){  el.addEventListener('click', function (e) {  for (let i = 0; i lt; totalPages; i  ) {  if(totalPages[i] lt; totalPages[i-1]){  pageCall(nextPage);  e.target.classList.add('active');  }  else if(totalPages[i] )  }  })  })  })  }  

Функция разделения URL API для использования страниц:

 function pageCall(page){  let urlSplit = lastUrl.split('?');  let queryParams = urlSplit[1].split('amp;');  let key = queryParams[queryParams.length -1].split('=');   if(key[0] != 'page'){  let url = lastUrl   'amp;page='   page;   console.log(lastUrl);  fetchURL(url);  }else{  key[1] = page.toString();  let a = key.join('=');  queryParams[queryParams.length -1] = a;  let b = queryParams.join('amp;');  let url = urlSplit[0]   '?'   b;  fetchURL(url);  }  }  

Поэтому, когда я нажимаю на разные элементы li, страницы API меняются, но после нажатия 2 или 3 раза моя оперативная память внезапно перегружается браузером, и браузер просто отстает и перестает отвечать.

Оперативная память при запуске функции: введите описание изображения здесь

Я предполагаю, что проблема может заключаться в том, что я объявляю функцию fetchurl() и использую ее внутри вызова страницы (), а затем использую этот вызов страницы() внутри вызова страницы (), так что это может быть перегрузка какой-то функции, но я не совсем уверен.

Комментарии:

1. КАЖДЫЙ раз, когда вы звоните, вы добавляете этого слушателя событий: el.addEventListener('click', function (e) { — переместите его и делегируйте , а также убедитесь, что вы не совершаете круговые звонки

2. Функция fetchURL должна делать только то, что следует из названия. Вместо этого он также добавляет прослушиватель событий при каждом вызове URL-адреса. После нескольких запусков количество событий увеличивается в геометрической прогрессии и вызывает нехватку памяти.

Ответ №1:

КАЖДЫЙ раз, когда вы звоните, вы добавляете этот прослушиватель событий: el.addEventListener («щелчок», функция (e) { — переместите его и делегируйте и убедитесь, что вы не совершаете циклические вызовы

Попробуйте воспользоваться этим кодом. Я не могу проверить это, потому что вы не указали URL и HTML

 document.getElementbyId('nav').addEventListener('click', function(e) {  const tgt = e.target.closest('li');  if (tgt) {  for (let i = 0; i lt; totalPages; i  ) {  if (totalPages[i] lt; totalPages[i - 1]) {  pageCall(nextPage);  tgt.classList.add('active');  }  }  } })  function pageCall(page) {  let url = new URL(lastUrl)  url.searchParams.set("page", page)   fetchURL(url.toString()); }  function fetchURL(url) {  lastUrl = url;  fetch(url)  .then(res =gt; res.json())  .then(data =gt; {  trendingMovies(data.results);  currentPage = data.page;  nextPage = currentPage   1;  prevPage = currentPage - 1;  totalPages = data.total_pages;  lastPage = totalPages;  if (currentPage lt;= 1) {  prev.classList.add('disabled');  next.classList.remove('disabled');  } else if (currentPage gt;= lastPage) {  prev.classList.remove('disabled');  next.classList.add('disabled');  } else {  prev.classList.remove('disabled');  next.classList.remove('disabled');  }  }) }  

Комментарии:

1. Привет! я отредактировал код, но есть некоторая ошибка: Неперехваченная синтаксическая ошибка: повторное объявление страницы формального параметра в функции pageCall() означает ли это, что я должен объявить ее по-другому?

2. @Карл, я виноват. См. обновление

3. это сработало просто отлично, спасибо!