Почему функция не может получить доступ к локальной переменной в объекте, объявленном снаружи

1

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

let field = 'email';

let options = {
  'message': '${field} is required'
}

function validation(field, opt = options) {
  console.log(opt.message);
}

validation('password');
validation('confirm', {message: 'Confirm password is required'})

Но в этом случае выход

"email is required"
"Confirm password is required"

Хотя я хочу, чтобы результат был

"password is required"
"Confirm password is required"

Я также хочу знать, как Javascript работает для этого кода. Как он получает доступ ко всему материалу и как получить требуемый результат.

Спасибо

  • 0
    Вы пытались отладить свой код? (Потому что из предоставленного вами фрагмента кода я настоятельно полагаю, что вы этого не сделали)
  • 0
    Возможно, чтобы быть более точным в отношении моего «злого» комментария, я спрашиваю, потому что вы назначаете внутри объявления функции, из-за чего большинство линтеров будут выдавать предупреждение!
Показать ещё 1 комментарий
Теги:

3 ответа

3
Лучший ответ

В своем коде вы просто создать option объект и создать его с message поля = "Требуется адрес электронной почты". И вы никогда не меняете его значение. В качестве альтернативы вы можете генерировать объект каждый раз, когда вы хотите его параметризовать:

const field = 'email';

const getOptions = (field) => ({
  'message': '${field} is required'
});

function validation(field, opt) {
  opt = opt || getOptions(field);
  console.log(opt.message);
}
3
let field = 'email';

let options = {
  'message': '${field} is required'
}

Это присваивает options.message текущее значение field. Поскольку вы никогда не меняете свою ценность, вы получаете "email is required". Параметр с именем field в function validation(field, opt = options) является другой переменной, чем глобальная с тем же именем. И его значение не влияет на значение options.message поскольку это назначение уже выполнено до того, как функция когда-либо вызывалась.

Манипулирование глобальными объектами считается плохим программированием. Вместо этого вы можете создать объект внутри функции:

function validation(field) {
    let opt = {
      'message': '${field} is required'
    }

      console.log(opt.message);
}
1
   message:'${field} is required'

Такой же как:

 message: field + " is required"

который непосредственно просматривает field и приводит к:

 message: "email is required"

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

 const options = {
   message: field => '${field} is required',
 }

 function validation(field, opt = options) {
   const msg = typeof opt.message === "function" ? opt.message(field) : opt.message;
   console.log(msg);
 }

 validation('password');
 validation('confirm', {message: 'Confirm password is required'})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню