Javascript 如何将对象作为作用域传递给eval?

Javascript 如何将对象作为作用域传递给eval?,javascript,Javascript,我有一个javascript对象,如下所示: var myobj = { 'a': 10, 'b': 20 } 我有一个条件存储在如下字符串中: var c = 'a==10'; 我想评估c中的条件是真是假。条件字符串中引用的变量,例如a是myobj的成员 我试过以下方法,但没有效果 eval.call(myobj, 'a==10'); 您真的应该质疑为什么要使用这样的动态JS内容。如果用户提供了c的值,则在eval中使用该输入之前,需要对其进行消毒。几乎总是有更好的选择 因此,我

我有一个javascript对象,如下所示:

var myobj = {
    'a': 10, 'b': 20
}
我有一个条件存储在如下字符串中:

var c = 'a==10';
我想评估c中的条件是真是假。条件字符串中引用的变量,例如
a
myobj
的成员

我试过以下方法,但没有效果

eval.call(myobj, 'a==10');

您真的应该质疑为什么要使用这样的动态JS内容。如果用户提供了
c
的值,则在
eval
中使用该输入之前,需要对其进行消毒。几乎总是有更好的选择

因此,我现在提出的解决方案实际上是强制执行一种不好的做法——在以下情况下不可用:

或者,根据您如何获得有关myobj的信息,这可能更容易/更困难:

with (myobj) var res = eval(c);
现在让我们来看一些更安全的方法。不要使用
c
这样的值,而是构建一个允许的表达式结构。例如:

var c = { prop: "a", operation: "equal", constant: 10 };
。。。然后像这样做:

var operations = {
    equal(a, b) => a == b,
    // define other operations here ...
};

function test(obj, c) {
    return operations[c.operation](obj[c.prop], c.constant);
}
太脏了:D

var myobj={
“a”:10,
b:20
}
变量c='a==10';
var res=(函数(){
返回eval('this.'+c+';');
}).apply(myobj);
控制台日志(res);
//或者作为在线者
var res2=((o)=>eval('o.+c)).call(null,myobj);

console.log(res2)以下是我尝试使用(用ES2015编写的)超级黑客解决此问题的方法:

const context={
a:10,
b:20,
};
常量表达式='a==10';
常量getAllMatches=(模式、字符串)=>
//确保字符串是字符串,并确保模式具有/g标志
String(String).match(新的RegExp(模式'g'));
//这种模式远远不够稳健
常量变量模式=/[a-zA-Z$\][0-9a-zA-Z$\*/;
const evalWithContext=(上下文,表达式)=>{
常量变量=getAllMatches(variablePattern,表达式);
//函数和参数是关键字,所以我使用缩写名称
const func=新函数(…变量,`return(${expression})`);
常量args=variables.map((arg)=>(Object.hasOwnProperty.call(context,arg)
?上下文[arg]
:未定义);
返回函数(…参数);
};

log(evalWithContext(context,expression))这不是“上下文”。您希望属性成为变量。“这是一个不同的概念。”特林科特重新表述了这个概念question@Nayan是否要检查
a
是否为
10
c=(myobj.a==10)
您的表达式是任意的JavaScript吗?如果是合理的子集,那么实现一种解析这些表达式并执行它们的方法将是比使用
eval
更好的解决方案。此外,您应该检查是否要使用严格模式,因为
eval
的行为会根据该模式的不同而变化。我看不到一个简单的方法来使用
eval
来实现您想要的,因为它可能最终取决于全局对象并对其进行重击。考虑有人想从中使用一些东西(比如说代码>数学。您的上下文可能具有匹配的属性。在这种情况下会发生什么?@Pilan不幸的是,这些条件来自另一个来源,我无法更改它们。应该注意的是,在严格的模式代码中,
with
语句是被禁止的。@JordanRunning,的确,这是一条重要的评论。根据你的建议,我正在尝试解析条件并对其进行评估。现在很容易,因为只有一些固定的条件。但是,当条件复杂时,解析和评估将成为一项艰巨的任务。在python
eval
中,获取一个scope对象,我在JS中也期望它。
var operations = {
    equal(a, b) => a == b,
    // define other operations here ...
};

function test(obj, c) {
    return operations[c.operation](obj[c.prop], c.constant);
}