함수 실행시 특정 객체를 스코프로 사용하도록 만들기

자바스크립트 질문입니다…
eval을 사용해서 어떤 표현식을 실행할건데,
이 eval이 실행될때, 특정 객체를 스코프로 사용했으면 합니다.
어떻게 해야할까요…?

let context = {
  foo: true,
  bar: {
    a: 2,
  }
// 이런식으로 여러종류의 변수들이 들어있음
};

function callTextAsFunction(x) {
  'use strict'
  try {
    /** 약간 이런 식...? 
    let { * } = context;
    */
    return eval(x); // 이 eval(x) 는 context 객체의 내용을 스코프로 사용
  } catch (e) {
    console.error(e);
  }
};

callTextAsFunction('bar.a === 42');

이런식으로 작동했으면 좋겠습니다…

왜 저렇게 하려고 하는건지 알려주실 수 있나요?

앞에 this.을 붙혀야 하겠지만 bind로 context를 this로 묶으면 될거 같습니다.

let context = {
foo: true,
bar: {
  a: 2,
}
// 이런식으로 여러종류의 변수들이 들어있음
};

function callTextAsFunction(x) {
  'use strict'
 try {
/** 약간 이런 식...? 
let { * } = context;
*/
  return eval(x); // 이 eval(x) 는 context 객체의 내용을 스코프로 사용
} catch (e) {
console.error(e);
 }
};

const bindFunction = callTextAsFunction.bind(context)
let res = bindFunction('this.bar.a === 32')

그러나 저 역시도 왜 이렇게 써야 하나 싶습니다.

1 Like
  1. 가장 쉬운 트릭: with 문을 사용하세요.
  2. 최신 기술을 사용한 말끔한 방법: Realm API를 사용하세요.

use strict 를 제거하면 될것 같습니다.
원래 eval 이 스코프를 수정하는데 use strict 를 붙히면 스코프를 수정하지 않습니다.