Наследование переменных из родительской области видимости в модулях Javascript - PullRequest
0 голосов
/ 26 февраля 2019

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

main.js

import {logMonth} from "./helpers";

document.addEventListener("DOMContentLoaded", () => {
  let month = "September";
  logMonth();
});

helpers.js

let logMonth = () => {
  console.log(month)
}

Это приведет к ошибке, поскольку logMonth() не имеет доступа к month variable.

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

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

1 Ответ

0 голосов
/ 26 февраля 2019

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

Итак logMonth = month => console.log( month ); и logMonth( 'September' ); предпочтительнее.

Вы можете использовать объект, если вам нужно отправить несколько параметров в функцию.Таким образом, вам не нужно менять подпись вызова функции во всех местах, вы просто добавляете к объекту еще один (необязательный) параметр:

logMonths = ({ year, month, day}) => { ...do stuff... }

Это будет работать как с logMonths({ month: 'september' }) как и в случае logMonths({ month: 'september', year: '2019' }), поэтому вам никогда не придется переходить на logMonths( null, 'september' ) и logMonths( 2019, 'september' ), например logMonths( 'september' ), везде, где вы использовали logMonths () до того, как у него был параметр year.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...