Javascript: заставить глобальный eval () вести себя как object.eval () - PullRequest
3 голосов
/ 25 августа 2011

Хорошо, у меня есть очень специфический случай, для которого мне нужно использовать 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 ]

2 голосов
/ 25 августа 2011

Вы можете сказать что-то вроде этого:

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 голос
/ 25 августа 2011

jsFiddle

РЕДАКТИРОВАТЬ: Как любезно указал @Mathew мой код не имеет смысла! Итак, рабочий пример с использованием строк:

function mysteriousFunction(ctx) {
    eval(ctx + ".myString = 'Our cruisers cant repel firepower of that magnitude!';");
}
var obj = {};
mysteriousFunction("obj");
alert(obj.myString);
0 голосов
/ 25 августа 2011

Я вполне уверен, что невозможно записать в область действия функции (т.е. имитировать var) из другой функции, без eval.

Обратите внимание, что когда вы передаете this, вы либо пропускаете окно, либо объект. Ни один из них не идентифицирует функцию (область неглобальной var).

...