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,它可能认为someCapStyle
是lwidth
。
答案 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中使用“函数重载”,但这是一种实现你想要的方法: