Переназначайте глобальные переменные локально, не изменяя их в глобальной области видимости.JavaScript - PullRequest
0 голосов
/ 13 декабря 2018

Я знаю, как заставить свой код работать так, как задумано, но я попытался использовать те же имена переменных и столкнулся со следующим вопросом:

Возможно ли переназначить минимальные и максимальные переменные внутри submitSettings ()так что в глобальном масштабе они остаются нетронутыми?(Вы можете увидеть в коде, почему я хотел, чтобы они остались неизменными в глобальной области видимости.)

Если да, пожалуйста, скажите мне, как и где я могу узнать больше об этой теме.

  // here i get the HTML elements from <input>.
  let min = document.getElementById('min')
  let max = document.getElementById('max')

  function submitSettings() {
    // here i want to validate the values from those HTML elements while maintaining the same variable names (min, max).
    function validateSettings() {
      min = min.valueAsNumber // My question: How can i reassign global variables locally without changing them in global scope?
      let max = max.valueAsNumber // Or: How can i get max variable from the scope from outside (from global scope)?

      min >= max ? console.log("Not good") : console.log("OK")
    }

    validateSettings()

    // here i want to clear <input>, but i can't because min and max are not HTML elements anymore, rather numbers.
    min.value = ''
    max.value = ''
  }

1 Ответ

0 голосов
/ 13 декабря 2018

Затенение переменных обычно считается плохой практикой по причинам, которые выделяет ваш код.Трудно поддерживать сферу от одного до следующего.Есть разные способы обойти это, но они в основном полагаются на переименование переменной для локального контекста.

// here i get the HTML elements from <input>.
  const min = document.getElementById('min')
  const max = document.getElementById('max')

  function submitSettings() {
    // here i want to validate the values from those HTML elements while maintaining the same variable names (min, max).
    function validateSettings() {
      let minValue = min.valueAsNumber // My question: How can i reassign global variables locally without changing them in global scope?
      let maxValue = max.valueAsNumber // Or: How can i get max variable from the scope from outside (from global scope)?

      minValue >= maxValue ? console.log("Not good") : console.log("OK")
    }

    validateSettings()


    min.value = ''
    max.value = ''
  }

Строго говоря, ключевое слово let является уникальным в том смысле, что оно создает блочные переменные, поэтому допускается следующее

const global = 1;
const local = () => {
  let global = 2;
  console.log(global);
}

local(); // logs 2
console.log(global); // logs 1

Но я не думаю, что этоочень хорошая практика

Вы также можете использовать тот факт, что validateSettings является функцией, и выдавать ей min и max аргументы.

// here i get the HTML elements from <input>.
  const min = document.getElementById('min')
  const max = document.getElementById('max')

  function submitSettings() {
    // here i want to validate the values from those HTML elements while maintaining the same variable names (min, max).
    function validateSettings(min, max) {    
      min >= max ? console.log("Not good") : console.log("OK")
    }

    validateSettings(min.value, max.value)


    min.value = ''
    max.value = ''
  }
...