Подскажите с вопросом: Есть объект и строка из которой нужно создать функцию в контексте объекта.
const scope = {
item : 1,
array : [1,2,3]
}
const code = 'array.indexOf(item);'
const func = new Function(`return ${code}`);
func.call(scope); //??????????
Какой подход применить к такой задаче(eval() применять нельзя)?
В вашем случае, вы не обращаетесь к контексту. Есть специальное слово this, которое является ссылкой на текущий контекст
const scope = {
item : 1,
array : [1,2,3]
}
// обращаемся к св-вам через this
const code = 'this.array.indexOf(this.item);'
const func = new Function(`return ${code}`);
console.log(func.call(scope));
Еще один вариант: передавать данные в качестве параметров
const scope = {
array : [1,2,3],
item : 1,
}
const code = 'array.indexOf(item);'
const func = new Function(...Object.keys(scope), `return ${code}`);
// но есть одна проблема. Нет ни какого стандарта на порядок ключей в объекте
// поэтому при вызове Object.keys в разных движках может быть разный порядок
// что не гарантирует, что скрипт будет работать всегда правильно
console.log(func(scope.array, scope.item));
Просто можно менять scope и будет меняться код функции.
const scope = {
item : 1,
array : [1,2,3],
cat : 228,
dog : 'Test',
obj : { a: 1 },
zero : 0,
item1337 : 1337,
}
const code = 'array.indexOf(item)'
const func = generate(code, scope)
console.log(func())
function generate (code, scope) {
const arg = Object.keys(scope)
const argValues = JSON.stringify(Object.values(scope))
const fullCode = `return ((${arg}) =>
${code}
)(...${argValues})`
console.log(fullCode)
return new Function(fullCode)
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей