Почему input.val() нельзя сохранить как глобальную переменную?

Я делаю несколько вызовов API сопоставления, используя значение поля ввода (которое является почтовым индексом) и передаю его в качестве аргумента для URL-адреса API. Я также сохраняю почтовый индекс в localStorage, чтобы использовать его для отображения в других местах.

Когда я устанавливаю var userPostalCode = $('#input').val() в качестве глобальной переменной, ничего не работает. Я даже поместил event.preventDefault() в свою функцию обработчика кликов, чтобы попытаться обойти это. Однако, когда я устанавливаю переменную для функции, она работает. Проблема здесь в том, что это не DRY, так как мне приходится повторять одну и ту же строку для каждого вызова API.

Как я могу а) сделать это СУХИМ и б) не могли бы вы объяснить, почему я не могу использовать его как глобальную переменную? Абстрагированный код ниже для контекста:

// Fires call to all API functions and renders page
myBtn.click(function(event) {
  event.preventDefault();
  // Runs mapping functions
  firstAPICall();
  secondAPICall()
  saveToLocalStorage()
});

function firstAPICall() {
  var userPostalCode = $('#input').val();
  var FIRST_URL = `https://anotherwebsite.com/query=${userPostalCode}&limit=6&api_key=${API_KEY}`;

  $.ajax({
    url: FIRST_URL,
    method: "GET"
  }).then(function(response) {
    // Code block
  });
};

function secondAPICall() {
  var userPostalCode = $('#input').val();
  var SECOND_URL = `https://somewebsite.com/location=${userPostalCode}&api_key=${API_KEY}`;

  $.ajax({
    url: SECOND_URL,
    method: "GET"
  }).then(function(response) {
    // Code block
  });
};

function saveToLocalStorage() {
  var userPostalCode = $('#input').val();
  savedSearches.push(userPostalCode);
  localStorage.setItem("zipCode", JSON.stringify(savedSearches));
};

Похоже, вы дали нам код, который работает, а не код, с которым вам нужна помощь. Не могли бы вы поделиться минимально воспроизводимым примером кода, который не работает, чтобы нам не пришлось гадать, что вы сделали не так? Я предполагаю, что вы пытались установить var userPostalCode = $('#input').val() до того, как это поле формы имело значение, и ожидали, что переменная будет обновляться при изменении поля ввода, чего не будет; но не видя кода это всего лишь предположение.

Daniel Beck 10.02.2023 02:09

(Мне непонятно, что вы ожидаете от event.preventDefault()? Для нажатия кнопки, которое предотвратило бы всплытие события щелчка на родительские элементы DOM, но это вообще не имеет отношения к проблеме здесь.)

Daniel Beck 10.02.2023 02:14

Когда вы используете объявление var, вы создаете локальную переменную, а не назначаете глобальную переменную.

Barmar 10.02.2023 02:36

Почему вы хотите, чтобы это была глобальная переменная? Глобальные переменные обычно имеют плохой дизайн. Если вы не хотите повторять var userPostalCode = $("#input").val(), сделайте это в обработчике кликов, а затем передайте его в качестве параметра другим функциям.

Barmar 10.02.2023 02:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить DRY-код, получите значение в обработчике кликов и передайте его в качестве параметра.

// Fires call to all API functions and renders page
myBtn.click(function(event) {
  event.preventDefault();
  let userPostalCode = $('#input').val();
  // Runs mapping functions
  firstAPICall(userPostalCode);
  secondAPICall(userPostalCode)
  saveToLocalStorage(userPostalCode)
});

function firstAPICall(userPostalCode) {
  var FIRST_URL = `https://anotherwebsite.com/query=${userPostalCode}&limit=6&api_key=${API_KEY}`;

  $.ajax({
    url: FIRST_URL,
    method: "GET"
  }).then(function(response) {
    // Code block
  });
};

function secondAPICall(userPostalCode) {
  var SECOND_URL = `https://somewebsite.com/location=${userPostalCode}&api_key=${API_KEY}`;

  $.ajax({
    url: SECOND_URL,
    method: "GET"
  }).then(function(response) {
    // Code block
  });
};

function saveToLocalStorage(userPostalCode) {
  savedSearches.push(userPostalCode);
  localStorage.setItem("zipCode", JSON.stringify(savedSearches));
};

Спасибо за объяснение, что var создает локальную переменную, я не знал об этом. Кроме того, ваше решение идеально и научило меня мыслить нестандартно.

BuiltByDan 10.02.2023 05:05

Другие вопросы по теме