Javascript:使全局eval()表现得像object.eval()

时间:2011-08-25 17:50:55

标签: javascript eval

好的 - 我有一个非常具体的案例,我需要使用eval()。在人们告诉我我根本不应该使用eval()之前,让我透露一下,我知道eval的性能问题,安全问题以及所有爵士乐。我在一个非常狭窄的情况下使用它。问题是:

我寻找一个函数,它将一个变量写入传递给它的任何范围,允许这样的代码:

function mysteriousFunction(ctx) {
//do something mysterious in here to write
//"var myString = 'Oh, I'm afraid the deflector shield will be 
//quite operational when your friends arrive.';"
}

mysteriousFunction(this);
alert(myString);

我尝试使用全局eval()来执行此操作,使用闭包伪造执行上下文,使用'with'关键字等等。我无法使其工作。我发现的唯一有用的是:

function mysteriousFunction(ctx) {
ctx.eval("var myString = 'Our cruisers cant repel firepower of that magnitude!';");
}

mysteriousFunction(this);
alert(myString); //alerts 'Our cruisers cant repel firepower of that magnitude!'

但是,上述解决方案需要object.eval()函数,该函数已弃用。它有效,但它让我很紧张。有人在乎这个问题吗?谢谢你的时间!

3 个答案:

答案 0 :(得分:2)

你可以这样说:

function mysteriousFunction(ctx) {
   ctx.myString = "[value here]";
}

mysteriousFunction(this);
alert(myString);     // catch here: if you're using it in a anonymous function, you need to refer to as this.myString (see comments)

演示:http://jsfiddle.net/mrchief/HfFKJ/

您也可以像这样重构:

function mysteriousFunction() {
   this.myString = "[value here]";   // we'll change the meaning of this when we call the function
}

然后call(双关语)你的函数使用不同的上下文:

var ctx = {};
mysteriousFunction.call(ctx);
alert(ctx.myString);

mysteriousFunction.call(this);
alert(myString);

演示:http://jsfiddle.net/mrchief/HfFKJ/4/

答案 1 :(得分:1)

jsFiddle

编辑:正如@Mathew所指出的那样,我的代码没有任何意义!所以使用字符串的工作示例:

function mysteriousFunction(ctx) {
    eval(ctx + ".myString = 'Our cruisers cant repel firepower of that magnitude!';");
}
var obj = {};
mysteriousFunction("obj");
alert(obj.myString);

答案 2 :(得分:0)

我很确定在没有var的情况下从另一个函数写入函数范围(即模拟eval)是不可能的。

请注意,当您传递this时,您要么传递窗口,要么传递一个对象。既不标识函数(非全局var的范围)。