如何不传递参数仍然使函数工作?

时间:2013-03-19 11:03:39

标签: javascript

function drawLine(ctx, sX, sY, eX, eY, sRGB, fRGB, lWidth, capStyle)
{
    ctx.beginPath();
    ctx.moveTo(sX, sY);
    ctx.lineTo(eX, eY);
    ctx.lineWidth = lWidth||5;
    ctx.strokeStyle = 'rgb(49, 129, 48)';
    ctx.lineCap = 'round';
    ctx.stroke();
    ctx.closePath();
}

然后我想调用这样的函数:

drawLine(ctx, 50, 50, 100, 100, someStrokeStyle, someFillStyle, someCapStyle);

如您所见,我已跳过lWidth参数。我希望函数仍然有效,即使lWidth未作为参数传递。我该怎么做? Atm,它可能认为someCapStylelwidth

5 个答案:

答案 0 :(得分:3)

当您有大量参数传递给您所拥有的函数时,请使用对象:

function foo({param1: val1, parma2: val2}) {}

在这种情况下,你不会依赖于参数的数量和它们的表示顺序。

所以你可以重写你的功能:

 function drawLine(drawObj)
{
    ctx.beginPath();
    ctx.moveTo(drawObj.sX, drawObj.sY);
    ctx.lineTo(drawObj.eX, drawObj.eY);
    ctx.lineWidth = drawObj.lWidth||5;
    ctx.strokeStyle = drawObj.sRGB;
    ctx.lineCap = drawObj.capStyle;
    ctx.stroke();
    ctx.closePath();
}

答案 1 :(得分:2)

当你没有传递任何参数时,会传递undefined值,所以只需检查函数是否已经传递参数:

if(typeof argument == "undefined") 
{ 
   argument = "default value";
}

所以要不通过lWidth,只需传递undefined作为其值

P.S。最好的方法是使用单个参数args,它将是包含所有当前参数作为属性的对象。

答案 2 :(得分:2)

您想要的是部分评估drawLine函数,为lWidth指定一个常量值。有一个名为Jeene的JavaScript库可以做到这一点。这就是你如何使用它:

function drawLine(ctx, sX, sY, eX, eY, sRGB, fRGB, lWidth, capStyle) {
    ctx.beginPath();
    ctx.moveTo(sX, sY);
    ctx.lineTo(eX, eY);
    ctx.lineWidth = lWidth || 5;
    ctx.strokeStyle = "rgb(49, 129, 48)";
    ctx.lineCap = "round";
    ctx.stroke();
    ctx.closePath();
}

Function.prototype.specialize = net.higherorder.jeene.Jeene.make();

var drawLine2 = drawLine.specialize({
    lWidth: null // or whatever value you want
});

然后按如下方式使用drawLine2

drawLine2(ctx, 50, 50, 100, 100, someStrokeStyle, someFillStyle, someCapStyle);

这称为专业化,是一种非常有用的模式。阅读更多相关信息:A Neighborhood of Infinity: The Three Projections of Doctor Futamura

答案 3 :(得分:1)

您可以将可选参数放在参数列表的末尾。这样,如果你把它留下来,其他参数都不会受到影响。

另一种选择是传递一个具有您想要定义的属性的对象,例如

function drawLine(options) {
    options.ctx.beginPath();
    options.ctx.moveTo(options.sX, options.sY);
    options.ctx.lineTo(options.eX, options.eY);
    // etc.
 }

答案 4 :(得分:1)

你不能在Javascript中使用“函数重载”,但这是一种实现你想要的方法:

How to overload functions in javascript?