Создание функции из строки и контекст функции

247
20 декабря 2018, 18:50

Подскажите с вопросом: Есть объект и строка из которой нужно создать функцию в контексте объекта.

const scope = {
  item : 1,
  array : [1,2,3]
}
const code = 'array.indexOf(item);'
const func = new Function(`return ${code}`);
func.call(scope); //?????????? 

Какой подход применить к такой задаче(eval() применять нельзя)?

Answer 1

В вашем случае, вы не обращаетесь к контексту. Есть специальное слово 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));

Answer 2

Просто можно менять 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) 
}

READ ALSO
Каким образом можно вернуть placeholder? TypeError: event is undefined

Каким образом можно вернуть placeholder? TypeError: event is undefined

Написал простенький скрипт для создания placeholder'a у select элементовВыдает ошибку

220
Не отображается на экране игра Змейка.javascript

Не отображается на экране игра Змейка.javascript

Пыталась на основе туториала создать игру змейкуИ вроде бы весь код проверила, но не могу найти ошибку

357
Добавить класс при клике другому div

Добавить класс при клике другому div

Есть несколько select-oвЕсли мы на него кликаем добовляется class="open" нашему списку

258