Ответ 1
Также существует объект Function.
var adder = new Function("a", "b", "return a + b");
Скажем, у меня есть строка Javascript, как показано ниже.
var fnStr = "function(){blah1;blah2;blah3; }" ;
(Это может быть выражение, введенное пользователем, должным образом дезинфицированное, или это может быть результатом некоторых символических вычислений. Это действительно неважно).
Я хочу определить fn
, как если бы в моем коде была следующая строка:
var fn = function(){blah1;blah2;blah3; } ;
Как это сделать?
Лучшее, что я придумал, следующее:
var fn = eval("var f = function(){ return "+fnStr+";}; f() ;") ;
Это похоже на трюк, хотя он использует ужасный eval()
и использует слегка запутанный аргумент. Могу ли я сделать лучше? То есть либо не использовать eval()
, либо снабдить его более простым аргументом?
Также существует объект Function.
var adder = new Function("a", "b", "return a + b");
Вы можете сделать это:
//in your case: eval("var fn = " + fnStr);
eval("var fn = function(){ blah1;blah2;blah3; }");
fn();
Не уверен, как сделать это намного проще, иногда нет (лучше) пути вокруг eval()
. Здесь быстрый пример этого в действии.
Используйте круглые скобки.
var fn = eval("(function() {...})");
Этот метод также хорош для передачи значений JSON.
Кстати, часто лучше строить функции, составляя их непосредственно из других функций. Если вы используете строки, вам нужно беспокоиться о таких вещах, как неожиданный захват переменных.
Конструктор Function создает новый объект Function. В JavaScript каждая функция фактически является объектом Function.
// Create a function that takes two arguments and returns the sum of those arguments
var fun = new Function("a", "b", "return a + b");
// Call the function
fun(2, 6);
Output: 8
Вы также можете вставить строку в элемент script, а затем вставить элемент script на страницу.
script_ele = window.document.createElement("script");
script_ele.innerHTML = 'function my_function(){alert("hi!");}';
window.document.body.appendChild(script_ele);
my_function();
в одну сторону:
var a = 'function f(){ alert(111); } function d(){ alert(222);}';
eval(a);
d();
второй более безопасный способ преобразования строки в funciton:
// function name and parameters to pass
var fnstring = "runMe";
var fnparams = ["aaa", "bbbb", "ccc"];
// find object
var fn = window[fnstring];
// is object a function?
if (typeof fn === "function") fn.apply(null, fnparams);
function runMe(a,b){
alert(b);
}
посмотреть рабочий код http://plnkr.co/edit/OiQAVd9DMV2PfK0NG9vk
Вы можете вызвать Parse your string как javascript fuction
function getDate(){alert('done')}
//предположим, что это ваша определенная функциядля вызова функции выше getDate() - это в строчном формате, например 'getDate()'
var callFunc=new Function('getDate()')
//Разбор и регистрация вашей функции
callFunc()
//Вызов функции
Вот что я использую для простых случаев:
// an example function
function plus(...args) {
return args.reduce( (s,v) => s+v, 0 );
}
// function to string
let str = plus.toString();
// string to function
let copy = new Function('return ' + str)();
// tests
console.assert(plus.name == 'plus');
console.assert(copy.name == 'plus');
console.assert(plus.constructor == Function);
console.assert(copy.constructor == Function);
console.assert(plus(1,2,3,4) === copy(1,2,3,4));
console.assert(plus.toString() === copy.toString());