2013-03-19 47 views
4
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

+0

你错过了一个参数,这是我看到的参数。我怎么知道这个lWidth参数 – 999k 2013-03-19 11:07:14

+0

@ 555k是的,当我选择不给参数时,该函数将如何工作。 – 2013-03-19 11:07:40

+0

您没有使用参数fRGB和capStyle。所以如果你错过了一个,那么函数会被调用capStyle = undefined。你的lWidth值将是一些容易的样式 – 999k 2013-03-19 11:10:39

回答

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

您可以将可选参数放在参数列表的末尾。这样,如果您将其忽略,其他参数将不会受到影响。

另一种选择是将单个对象与要定义的属性一起传递,例如

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

这并不能真正解决问题。如果我没有在选项对象中指定lWidth,该函数仍然会失败。我对吗? – 2013-03-19 11:12:52

+0

是的,但您可以测试它未定义。 – SteveP 2013-03-19 11:14:53

+0

好的。我认为可能有一个更简单的方法。但没关系。感谢你的回答。 – 2013-03-19 11:17:01

2

当你不传递任何参数,undefined值传递代替,所以只检查函数的参数是否已经通过与否:

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

所以不会穿lWidth,只需通过undefined作为其值

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

+0

有没有办法完全跳过它,甚至没有指定未定义? – 2013-03-19 11:15:37

+0

@AnkurSharma是的。使用if(参数) – 999k 2013-03-19 11:19:27

+0

@ 555k但它会认为lWidth被定义,并且capStyle没有被定义。你明白我的意思吗?无论如何,它的确定,我只会使用其他回答者所示的对象。谢谢回答。 – 2013-03-19 11:23:12

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

+0

请问函数自动知道someCapStyle是否是capStyle而不是lWidth。 – 2013-03-19 11:29:20

+0

@AnkurSharma - 是的,它的确如此。这是专业化非常酷的事情。阅读博客文章,确切知道发生了什么:http://blog.higher-order.net/2008/09/14/jeene/ – 2013-03-19 11:31:30

+0

如果两个参数都是字符串类型,该怎么办?函数如何知道哪一个是正确的?你能用简单的语言来解释吗?我是个新手,对此很感兴趣。 – 2013-03-19 11:37:29