如何在不将其更改为字符串的情况下从函数中选取一个参数?

时间:2018-12-01 12:19:49

标签: javascript

我认为这是一个非常愚蠢的问题,但请帮忙:)

我试图创建一个函数来绘制像sin(x)这样的图形:

    var x = 0;
    var zoom = 10;

    function plot(function_name) {

        function draw() {
            var y = function_name;
            c.arc(x * zoom, y * zoom, 1, 0, Math.PI * 2, false);
            c.strokeStyle = '#fff';
            c.stroke();

            x += 0.1;
        }

        function animate() {
            requestAnimationFrame(animate);
            draw();
        }

        animate();
    }

    plot('Math.sin(x)');

但是问题是,它把我的论点当作字符串(我认为是)。如果我不加双引号,它将计算sin(0)并给出0作为参数。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

它将参数选为字符串,因为您将其作为字符串传递。
您可以通过以下方式将函数作为参数传递:

var x = 0;
var zoom = 10;

function plot(func) {

    function draw() {
        var y = func(x); // calculate y by applying func to x
        c.arc(x * zoom, y * zoom, 1, 0, Math.PI * 2, false);
        c.strokeStyle = '#fff';
        c.stroke();

        x += 0.1;
    }

    function animate() {
        requestAnimationFrame(animate); // move requestAnimationFrame to the end?
        draw();
    }

    animate();
}

plot(Math.sin); // pass function itself as an argument
plot(Math.cos); // or any other function

// or even custom function
function myEquation(x)
{
    return x * x + 2 * x - 4;
}
plot(myEquation);

答案 1 :(得分:0)

您实际上可以将函数传递给plot

function plot(func) {
    // ...
    var result = func(param);   // call the function with 'param' and store its result in 'result'
    // ..
}

然后您可以这样称呼它:

plot(Math.sin);                 // 'func' inside 'plot' will be 'Math.sin'
plot(Math.cos);                 // 'func' inside 'plot' will be 'Math.cos'
// ...

如果您想做更多的事情,则可以传递一个匿名函数:

plot(function(x) {              // 'func' inside 'plot' will be a function that takes a number 'x' and return 'Math.sin(x) * Math.cos(x)'
    // do something with x first like validation for example
    return Math.sin(x) * Math.cos(x);
});

注意:您必须在x函数内部为函数func提供一个draw