изменение строки в функцию в JavaScript (не Eval) - PullRequest
9 голосов
/ 26 июля 2010
var foo = "function (){ alert('meee'); }";
foo();

Я пробовал выше, но это не работает, есть ли другой способ выполнить эту функцию без использования eval?

thnx

Ответы [ 3 ]

12 голосов
/ 27 июля 2010

вы хотите использовать конструктор Function напрямую, как сказал Андерс. Все аргументы являются строками. Последний аргумент - это тело функции, любые ведущие аргументы - это имена аргументов, которые принимает функция.

Для заимствования из примера Андерса,

var multiply = new Function("x", "y", "return x * y");

будет похоже на написание

var multiply = function (x,y) {
  return x * y
}

В вашем случае у вас есть "function (){ alert('meee'); }", и вы хотите сохранить его как функцию в var foo.

var fn = "function (){ alert('meee'); }";
var foo = new Function("return ("+fn+")")();
foo();
// alerts "meee"

Разница между Function и eval в том, что eval выполняется в частной области, тогда как Function работает в глобальной области.

var x="haha", y="hehe";

function test () {
  var x=15, y=34;
  eval("alert('eval: ' + x + ', ' + y)");
  new Function("alert('Func: ' + x + ', ' + y)")();
} 

test();

// eval: 15, 34
// Func: haha, hehe

Не пытайтесь запустить его в консоли, вы получите обманчивый результат (консоли используют eval). Запись в тег <script> и загрузка его в браузер даст истинный результат.

3 голосов
/ 26 июля 2010

Согласно MDC .Использование:

var multiply = new Function("x", "y", "return x * y");
var theAnswer = multiply(7, 6);
0 голосов
/ 26 июля 2010

не то, что я знаю ... вероятно, есть лучший способ сделать то, что вы пытаетесь сделать, не делая себя уязвимым для атаки инъекцией скрипта, которая не включает передачу javascript в виде строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...