Преобразование eval в функцию при сохранении результата как части внешнего объекта? - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь преобразовать некоторый код, который использует eval, для использования Function на основе этих примеров , и я не совсем понимаю, как сохранить результат вызова функции как часть существующего объекта. Что мне здесь не хватает?

async function test(){
  let obj={"Name":"BOB"}
  let ret={};

  //eval- works perfectly. stores the result in ret.eval
  let evalstr='ret.eval=obj["Name"].toLowerCase()'
  eval(evalstr)

  //function- 1st attempt- ret not defined
  let funcstr='ret.function=obj["Name"].toLowerCase()'
  Function('"use strict";return (' + funcstr + ')')();

  //2nd attempt-obj not defined
  let funcstr='obj["Name"].toLowerCase()'
  ret.function=Function('"use strict";return (' + funcstr + ')')();

  console.log(ret)
}

test()

1 Ответ

1 голос
/ 04 октября 2019

Я не совсем уверен, почему вы пытаетесь это сделать, и я не рекомендовал бы это на основании предоставленного примера. Я уверен, что есть лучший способ достичь желаемого результата, если бы вы могли предоставить больше контекста.

Тем не менее, если вы хотите исправить код, вам нужно сделать ret и / или obj доступно для вновь созданного Function, которое включает объявление их в качестве параметров и последующую передачу параметров.

async function test(){
  let obj={"Name":"BOB"}
  let ret={};

  //eval- works perfectly. stores the result in ret.eval
  let evalstr='ret.eval=obj["Name"].toLowerCase()'
  eval(evalstr)

  //function- 1st attempt- ret not defined
  let funcstr='ret.function=obj["Name"].toLowerCase()'
  Function('ret', 'obj', '"use strict";return (' + funcstr + ')')(ret, obj);

  //2nd attempt-obj not defined
  funcstr='obj["Name"].toLowerCase()'
  ret.obj=Function('obj', '"use strict";return (' + funcstr + ')')(obj);

  console.log(ret)
}

test()
...