Подтвердить что ты не робот

Выполнение анонимных функций, созданных с использованием JavaScript eval()

У меня есть функция и ее содержимое в виде строки.

var funcStr = "function() { alert('hello'); }";

Теперь я делаю eval(), чтобы фактически получить эту функцию в переменной.

var func = eval(funcStr);

Если я правильно помню, в Chrome и Opera просто вызывается

func();

вызывается эта функция и отображается предупреждение.

Но в других браузерах это было не так. ничего не произошло.

Я не хочу аргументировать, что это правильный метод, но как я могу это сделать? Я хочу иметь возможность вызывать переменную(); для выполнения функции, сохраненной в этой переменной.

4b9b3361

Ответ 1

Как насчет этого?

var func = new Function('alert("hello");');

Чтобы добавить аргументы в функцию:

var func = new Function('what', 'alert("hello " + what);');
func('world'); // hello world

Обратите внимание, что функции являются объектами и могут быть назначены любой переменной:

var func = function () { alert('hello'); };
var otherFunc = func;
func = 'funky!';

function executeSomething(something) {
    something();
}
executeSomething(otherFunc); // Alerts 'hello'

Ответ 2

IE не может eval функции (предположительно по соображениям безопасности).

Лучшим обходным решением является установка функции в массив, например:

var func = eval('[' + funcStr + ']')[0];

Ответ 3

Я понимаю, что это старо, но это был единственный действительный результат, который появился в моих поисковых системах Google для оценки анонимных строк функции javascript.

Наконец-то я понял, как это сделать из сообщения в группе jquery google.

eval("false||"+data)

где данные являются вашей функциональной строкой типа "function() {return 123;}"

До сих пор я только пробовал это в IE8 и FF8 (браузеры на моем персональном компьютере), но я считаю, что jquery использует это внутри, поэтому он должен работать почти везде.

Ответ 4

Попробуйте

var funcStr = "var func = function() { alert('hello'); }";

eval(funcStr);

func();

Ответ 5

Используйте eval следующим образом:

var func = eval('(' + funcStr + ')');

Ответ 6

Мы решили эту проблему, подготовив универсальный парсер функций, который преобразует строку в реальную функцию JavaScript:

if (typeof String.prototype.parseFunction != 'function') {
    String.prototype.parseFunction = function () {
        var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi;
        var match = funcReg.exec(this.replace(/\n/g, ' '));

        if(match) {
            return new Function(match[1].split(','), match[2]);
        }

        return null;
    };
}

примеры использования:

var func = 'function (a, b) { return a + b; }'.parseFunction();
alert(func(3,4));

func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction();
func();

здесь является jsfiddle

Ответ 7

Что также работает

var myFunc = function(myParam){
   // function body here
}

Ответ 8

EVAL без eval()...

function evalEx(code){
  var result,D=document,S=D.createElement('script'),
  H=D.head||D.getElementsByTagName['head'][0],
  param=Array.prototype.slice.call(arguments);
  code='function evalWE(){'+code+'}';
  S.innerText===''?S.innerText=code:S.textContent=code;
  H.appendChild(S);
  result=evalWE.apply(this,param);
  H.removeChild(S);
  return result
}

Пример использования:

ABC=evalEx('return "ABC"');
nine=evalEx('return arguments[1]+arguments[2]',4,5);

Ответ 9

Простой пример определения функции как строки, eval() ing и передачи в параметре при одновременном вызове функции (а затем сбрасывании результата на консоль):

console.log('eval: %s', eval("(function(foo) { return foo.bar; })")({"bar": "12345"}));

Здесь выводятся следующие данные.

eval: 12345

Ответ 10

Это тоже нормально.

var func = eval("_="+funcStr);

Ответ 11

function-serialization-tools предоставляет функцию s2f(), которая принимает строковое представление функции и возвращает ее как функцию.