如何将字符串转换为函数

时间:2016-11-19 05:00:41

标签: javascript

所以这一直困扰着我。例如,获取字符串输入并绘制其功能。所以我想知道如何使用基本字符串并返回一个可以运行的函数。不是desmos.com特别是他们只是一个很好的例子。 如何从字符串返回工作函数? 如果你返回function(),我会看到它的每一种方式......它会尝试运行该函数然后立即返回它。 例如: var string =“x ^ 2”; //返回 函数f =(x)=> {     return x * x; } 编辑:扩大尝试和解释更好,这有点难以解释。 function generate_f =(string)=> {     return f(x); } f = generate_f(“x ^ 2”); 返回:可以调用的函数,例如将函数绘制到画布。 函数f =(x)=> {return Math.pow(x,2); } f = generate_f(“x ^ 3 + 4”); 函数f =(x)=> {return Math.pow(x,3)+ 4; } 想象一下,我通过解析器运行字符串,我将“x ^ 3 + 4”标记为数组[“x”,“^”,3,“+”,4]我循环查看x,查看下一个值看^然后3我然后将Math.pow(x,3)添加到一个东西,因为它检查功率值,然后我添加到那个东西+4,现在如果我这样做它会在Math.pow(x, 3)因为没有x值所以你将如何返回一个工作函数。

3 个答案:

答案 0 :(得分:1)

我相信你必须对字符串进行一些解析才能获得你正在寻找的全部功能。

你可以玩的体面的图书馆是http://mathjs.org/docs/expressions/parsing.html

答案 1 :(得分:0)

这称为字符串解析。实际上,它正是Web浏览器如何获取JavaScript代码并使计算机执行某些操作。您只需要将数学表达式转换为可以评估的某种形式。您无需将其转换为JavaScript。您可以手动解析或使用库来帮助您。我建议你进一步研究字符串解析。

答案 2 :(得分:0)

使用JavaScript Function Constructor

例如:

var square = Function("x", "return Math.pow(x,2)");

square(2);  // 4

生成动态功能

您对generate_f功能有正确的想法。您只需使用Function构造函数将字符串输入转换为可以调用的函数。

function generate_f(expression){

    // use Function constructor
    // to build a new function
    // from the 'expression' string argument

    var customFunction = Function("x", "return " + expression);

    return customFunction;
}

var myFunction = generate_f("Math.pow(x,3) + 4;");

myFunction(2);  // 12

<强>参数

您将注意到在上面的示例中,Function构造函数用于创建具有单个参数x的函数。如果要构建一个接受更多参数的函数,可以使用逗号分隔的列表或每个参数一个字符串。

示例:

// function arguments defined using a comma-delimited list
var sum = Function("x, y, z", " return x + y + z; ");

// function arguments defined using one string per argument
var add = Function("a", "b", " return a + b; ");

var i = sum(1, 2, 3);  // 6

add(i, 1); // 7

如果要生成一个不接受任何参数的函数,只需提供函数体表达式。

var functionBody = " return 'This function has no arguments.'; ";
var noArgs = Function(functionBody);
noArgs(); // This function has no arguments.

备注

  • Function构造函数的任何前导参数都是生成函数的参数。 Function构造函数的最后一个参数始终是函数体。

  • 使用Function构造函数时,请记住始终键入大写字母F:

// function constructor (returns a new function)
var myFunction = Function(functionArgument, functionBody);

// function declaration (declares a function)
    myFunction = function(){ /* expression */ };
  • generate_f函数可以这样重写:
function generate_f(){

    var args = Array.prototype.slice.call(arguments);
    var nArguments = args.length;
    var functionBody;

    if(nArguments == 1){  // build function with no arguments (function body only)

      functionBody = args[0];

      return Function(functionBody);

    }else if(nArguments > 1){ // build function that accepts arguments

      functionBody = args.pop(); // remove last argument (the function body)

      // form a comma-delimited list
      // from the remaining arguments (the leading arguments)

      var functionParameters = args.join(','); 

      return Function(functionParameters, functionBody);

    }

    return false;

}

然后您可以使用generate_f来构建每个示例中的函数:

var square = generate_f("x", " return Math.pow(x,2); ");
var myFunction = generate_f("x", " return Math.pow(x,3) + 4; ");
var sum = generate_f("x, y, z", " return x + y + z; ");
var add = generate_f("a", "b", " return a + b; ");
var noArgs = generate_f(" return 'This function has no arguments.'; ");