function SomeFunc()
{
this.var1 = 123;
this.evalStr = "console.log('myvar:' + this.var1)";
}
var sf = new SomeFunc();
eval(sf.evalStr); // returns "myvar: undefined"
我想 eval 考虑我的实例化对象上的变量,我该怎么做?
编辑:你标记为重复的问题比我问的要复杂得多。我在这里谈论的是逃避字符串。
编辑:嘿,我的问题不应该仅仅因为我敢说"eval"而被否决。 嘘。 如果你往下看,你会发现答案非常有用。
这个问题的第一个答案中的evalInContext
函数正是你所要求的。只需用sf.evalStr
和sf
来调用它:
function SomeFunc() {
this.var1 = 123;
this.evalStr = "console.log('myvar:' + this.var1)";
}
var sf = new SomeFunc();
function evalInContext(js, context) {
return function() {
return eval(js);
}.call(context);
}
evalInContext(sf.evalStr, sf); // logs myvar:123
但是,最好使用构造函数。它们并不像eval()
那么可怕:
function SomeFunc() {
this.var1 = 123;
this.evalStr = "console.log('myvar:' + this.var1)";
}
var sf = new SomeFunc();
new Function(sf.evalStr).call(sf); // logs myvar:123
也许你需要这样的东西:
function SomeFunc()
{
this.var1 = 123;
this.evalStr = "console.log('myvar:' + this.var1)";
this.eval = function(){return eval(this.evalStr)};
}
var sf = new SomeFunc();
sf.eval(); // returns "myvar: 123"
这会将上下文保留在构造函数中,其中this
表示您认为的含义。
如果要将其保留在外部,则必须使用Function
在动态代码中赋予this
含义。在旧版本的 Firefox 中,eval
的第二个参数将提供上下文,但该功能已被弃用并删除,可能是因为Function
可以处理该用例。