Учитывая строку, описывающую функцию Javascript, преобразуйте ее в функцию Javascript - PullRequest
41 голосов
/ 04 апреля 2010

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

Ответы [ 8 ]

59 голосов
/ 08 января 2011

Есть также объект Function .

var adder = new Function("a", "b", "return a + b");
25 голосов
/ 04 апреля 2010

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

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

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

11 голосов
/ 23 января 2011

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

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

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

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

4 голосов
/ 19 мая 2017

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

// 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());
3 голосов
/ 19 октября 2016

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

script_ele = window.document.createElement("script");
script_ele.innerHTML = 'function my_function(){alert("hi!");}';
window.document.body.appendChild(script_ele);
my_function();
3 голосов
/ 21 января 2014

Конструктор 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
2 голосов
/ 21 февраля 2017

Вы можете называть Parse своей строкой как javascript fuction

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

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

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

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

2 голосов
/ 18 августа 2015

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

     var a = 'function f(){ alert(111); } function d(){ alert(222);}';  
     eval(a);
     d();

второй более безопасный способ преобразования строки в функцию:

     // 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

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