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

Учитывая строку, описывающую функцию Javascript, преобразуйте ее в функцию Javascript

Скажем, у меня есть строка 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(), либо снабдить его более простым аргументом?

4b9b3361

Ответ 1

Также существует объект Function.

var adder = new Function("a", "b", "return a + b");

Ответ 2

Вы можете сделать это:

//in your case: eval("var fn = " + fnStr);
eval("var fn = function(){ blah1;blah2;blah3; }"); 
fn();

Не уверен, как сделать это намного проще, иногда нет (лучше) пути вокруг eval(). Здесь быстрый пример этого в действии.

Ответ 3

Используйте круглые скобки.

var fn = eval("(function() {...})");

Этот метод также хорош для передачи значений JSON.

Кстати, часто лучше строить функции, составляя их непосредственно из других функций. Если вы используете строки, вам нужно беспокоиться о таких вещах, как неожиданный захват переменных.

Ответ 4

Конструктор 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

Ответ 5

Вы также можете вставить строку в элемент script, а затем вставить элемент script на страницу.

script_ele = window.document.createElement("script");
script_ele.innerHTML = 'function my_function(){alert("hi!");}';
window.document.body.appendChild(script_ele);
my_function();

Ответ 6

в одну сторону:

     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

Ответ 7

Вы можете вызвать Parse your string как javascript fuction

  • function getDate(){alert('done')}//предположим, что это ваша определенная функция

для вызова функции выше getDate() - это в строчном формате, например 'getDate()'

  1. var callFunc=new Function('getDate()')//Разбор и регистрация вашей функции

  2. callFunc()//Вызов функции

Ответ 8

Вот что я использую для простых случаев:

// 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());