有没有办法设置一个评估的整体?我想设置一个eval的全局值,因此不必在所有内容前加上obj
。
如果我执行以下操作,则会收到错误消息
ReferenceError:未定义MyClass
let obj = {
MyClass: class MyClass {
static CallMe() {}
}
}
eval(`
'use strict';
global = obj;
result = MyClass.CallMe();
`)
但是,如果我这样做:
result = obj.MyClass.CallMe();
它可以工作,但是我想这样做,所以我不必在调用前加上obj前缀。有什么理由可以做到这一点?
答案 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();
`)