Выполнение анонимных функций, созданных с использованием JavaScript eval()
У меня есть функция и ее содержимое в виде строки.
var funcStr = "function() { alert('hello'); }";
Теперь я делаю eval(), чтобы фактически получить эту функцию в переменной.
var func = eval(funcStr);
Если я правильно помню, в Chrome и Opera просто вызывается
func();
вызывается эта функция и отображается предупреждение.
Но в других браузерах это было не так. ничего не произошло.
Я не хочу аргументировать, что это правильный метод, но как я могу это сделать? Я хочу иметь возможность вызывать переменную(); для выполнения функции, сохраненной в этой переменной.
Ответы
Ответ 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(), которая принимает строковое представление функции и возвращает ее как функцию.