默认的function参数sorting

通过阅读,我来到了函数参数的默认值:

fill = (container, liquid = "coffee") -> "Filling the #{container} with #{liquid}..." 

这很整洁,但是我尝试了这个:

 fill = (container="mug", liquid = "coffee") -> "Filling the #{container} with #{liquid}..." alert fill(liquid="juice") 

并用"Filling the juice with coffee..."得到意想不到的警报。 那么我试过这个:

 fill = (container="mug", liquid = "coffee") -> "Filling the #{container} with #{liquid}..." alert fill(null, "juice") 

它的工作。 虽然不是很漂亮 有没有更好的方法,或者这是做到这一点的惯用方法?

 fill = ({container, liquid} = {}) -> container ?= "mug" liquid ?= "coffee" "Filling the #{container} with #{liquid}..." alert fill(liquid: "juice", container: "glass") alert fill() 
 fill = (quantity="500 mL", {container, liquid} = {}) -> container ?= "mug" liquid ?= "coffee" "Filling the #{container} with #{quantity} of #{liquid}..." alert fill("1L", liquid: "juice", container: "glass") alert fill() alert fill "1L" alert fill "1L", liquid: "water" 

埃米尔和杰里米已经有了这个。 正如他们指出的,函数的参数列表中的container="mug"实际上只是函数体中的container ?= "mug"缩写。

让我补充一点,在调用函数时,

 fill(liquid="juice") 

意味着与JavaScript相同的东西:首先,将值"juice"分配给liquidvariables; 然后通过liquidfill 。 CoffeeScript在这里没有做任何特殊的事情,而且在这种情况下, liquid与函数调用之外的范围相同。

顺便说一句,我build议通过允许跳过参数来使默认参数语法更强大(例如(first, middle ?= null, last) ->如果只有两个参数是通过),而应该使用?=语法而不是= 。 您可能要在此表示对该提案的支持: 问题1091 。

目前,无法使用命名参数进行调用。 这将需要知道调用网站的参数(名称,位置和/或默认值),这在javascript / coffeescript中并不总是可行的。

相反,如果你有很多参数,你想命名它们,并有默认值,你可以做这样的事情:

 fill = (opts = {}) -> opts.container ?= "mug" opts.liquid ?= "coffee" "Filling the #{opts.container} with #{opts.liquid}..." alert fill liquid:"juice" container:"cup" alert fill liquid:"juice" alert fill()