我认为这是一个非常愚蠢的问题,但请帮忙:)
我试图创建一个函数来绘制像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作为参数。
我该如何解决?
答案 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
。