设置评估范围

时间:2019-07-17 20:27:48

标签: javascript node.js

有没有办法设置一个评估的整体?我想设置一个eval的全局值,因此不必在所有内容前加上obj

如果我执行以下操作,则会收到错误消息

  

ReferenceError:未定义MyClass

let obj = {
  MyClass: class MyClass {
    static CallMe() {}
  }
}

eval(`
  'use strict';
  global = obj;
  result = MyClass.CallMe();
`)

但是,如果我这样做:

result = obj.MyClass.CallMe();

它可以工作,但是我想这样做,所以我不必在调用前加上obj前缀。有什么理由可以做到这一点?

3 个答案:

答案 0 :(得分:3)

我无法想象为什么您需要在这里使用eval,但是如果这样做,您可以在评估的代码中使用with (obj)

eval(`
    'use strict';
     with (obj) {
         result = MyClass.CallMe();
     }
`);

我仍然觉得您不应该在这里使用eval(它有什么用?),因为如果您不小心,很容易不小心使自己容易受到注入漏洞的攻击。您在这里使用eval是什么?也许我们可以指出一种更好的方法。

答案 1 :(得分:0)

不知道为什么要使用eval,尤其是这种奇怪的方式,但这可能是您要寻找的东西:

class MyClass {
    static CallMe() {
        return 'sample';
    }
}

eval(`
  'use strict';
  let result = MyClass.CallMe();
  console.log(result);
`)

答案 2 :(得分:0)

其他人已经警告过您使用eval的风险,因此我自己不会这样做。

我当然在受控环境中发现了eval的一些合法用例。我假设您知道自己在做什么。

可能有用

let obj1 = {
  foo: () => console.log('scope: obj1')
};

let obj2 = {
  foo: () => console.log('scope: obj2')
};


const scopedEval = (context, code) =>
  new Function('global', code)(context, code);

scopedEval(obj1, `
  global.foo();
`)

scopedEval(obj2, `
  global.foo();
`)

相关问题