#javascript #node.js
#javascript #node.js
Вопрос:
Если у меня есть два файла,
Файл 1
exports.run = () => {
console.log(test.property, test2.property, etc.property)
};
exports.info = {
name : "test"
}
Файл 2
const fs = require('fs');
let test;
let test2;
let etc;
test.property = "test";
test2.property = "test2";
etc.property = "etc";
let functions = new Map();
fs.readdir('./', (err, files) => {
if (err) console.error(err);
files.forEach(f => {
let props = require(`./${f}`);
functions.set(props.info.name, props);
});
});
functions.get("test").run()
Поскольку у меня это есть прямо сейчас, мне нужно вручную добавить каждую переменную в качестве параметра в файл 1, а в файле 2 мне нужно вручную передать каждую через .run()
. Это утомительно и раздражает, так могу ли я в любом случае просто охватить .run()
, чтобы он использовал все текущие переменные?
Комментарии:
1. Я пытаюсь понять ваш код, но не могу понять вашу цель. Может быть, сделать код короче и чище и объяснить вопрос по-другому?
2. У меня много функций, и мне нравится иметь несколько файлов, поскольку это проще и организованнее, и я помещаю все функции в карту, чтобы она не была такой запутанной, поскольку у меня много функций, но для каждой из них, когда я их вызываю, я должен передавать параметры. Было бы намного проще, если бы все эти функции могли быть просто ограничены, как функции, которые я определяю в основном коде, так есть ли способ сделать это?
3. Я пытаюсь понять ваш вариант использования здесь; итак, у вас есть несколько модулей, в каждом из которых есть некоторые функции, и вы пытаетесь передать значения из основного скрипта в каждый из этих модулей?
4. Область видимости — это просто контейнер переменных. Знаете, что еще является контейнером переменных? Объект! Просто поместите все, что вы хотите передать, параметры в объект и передайте этот один объект вашим функциям. Таким образом, вы можете свободно добавлять или удалять переменные без необходимости менять их в нескольких местах.
Ответ №1:
Я не уверен, тот ли это код, который вам нужен
const args = {
foo: ["a", "b"],
bar: ["c", "d", "e"]
}
const map = new Map();
function Foo(first, second) {
console.log(first, second)
}
function Bar(first, second, third) {
console.log(first, second, third)
}
map.set("foo", Foo);
map.set("bar", Bar);
function run() {
for(const key of map.keys()) {
const func = map.get(key);
func.apply(undefined, args[key])
}
}
run();
// output
// a b
// c d e
ключевым моментом является apply
функция, которая может вызывать ссылку на функцию со своими аргументами в качестве apply
аргументов. Вы можете подробнее ознакомиться с MDN of apply
.
Комментарии:
1. Боже мой,
apply
. Вы спасаете2. Рад решить вашу проблему. Кстати, ваш код вопроса вводит в заблуждение, вы должны прояснить это, т. Е. в нем ничего нет о файлах и модулях.
3. Это не работает, я чувствую, что это связано с тем фактом, что это несколько файлов. Если я не использую
module.exports.run
orexports.run
, это работает нормально, как задумано, но как только они у меня появляются, они перестают работать : (4. что такое несколько файлов, вы имеете в виду много функций во многих модулях? Вы можете изменить код вашего вопроса, чтобы мне было проще понять, и не забудьте сделать код понятным, точно таким, какой я вам отправил.
5. @программист-новичок?