Как внедрить переменную в закрытие функции (Node.js VM)?
Предположим, у меня есть этот код:
import vm from 'node:vm';
const code = `
const baz = "qux";
foo(() => { console.log(bar, baz) })
`;
const context = {
foo: (routine: Function) => {
console.log(routine());
},
};
vm.createContext(context);
vm.runInNewContext(code, context);
Когда виртуальная машина запускается, она запускаетfoo
обратный вызов в контексте, который затем оценивает функцию, которая затем регистрирует — как мне ввести только вroutine
закрытие?
Я хотел бы иметь возможность сделать что-то вроде этого:
const context = {
foo: (routine: Function) => {
vm.runInNewContext(routine(), {bar: 'A'})
vm.runInNewContext(routine(), {bar: 'B'})
},
};
Я думаю, что единственный способ - преобразовать функцию обратно в строку, но тогда вы потеряете родительское закрытие, которое мне также нужно, т.е.
import vm from 'node:vm';
const code = 'const baz = "qux"; foo(() => { console.log(bar, baz) })';
const context = {
foo: (routine: Function) => {
vm.runInNewContext('(' + routine.toString() + ')()', {
bar: 'A',
});
},
};
vm.createContext(context);
vm.runInNewContext(code, context);
Это вызовет ошибку оbar
недоступность.