好的 - 我有一个非常具体的案例,我需要使用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()函数,该函数已弃用。它有效,但它让我很紧张。有人在乎这个问题吗?谢谢你的时间!
答案 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);
答案 1 :(得分:1)
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
的范围)。