带参数的函数定义

时间:2012-09-07 03:48:35

标签: coffeescript

我是CoffeeScript的新手,所以也许我的问题不具有建设性。如果是的话,我很抱歉。无论如何,问题是写功能。我尝试了两种方法如下,但变量不能很好地工作。我该怎么写呢?

第一种方式:arg.foo

triangle = (arg...) ->
    if arg.base == undefined then arg.base = 1;
    if arg.height == undefined then arg.height = 1;
    arg.base * arg.height / 2

document.writeln triangle
    base:8
    height:5 # => return 0.5 ...

第二种方式:arg ['foo']

triangle = (arg...) ->
    if arg['base'] == undefined then arg['base'] = 1;
    if arg['height'] == undefined then arg['height'] = 1;
    arg['base'] * arg['height'] / 2

document.writeln triangle
    base:8
    height:5 # => return 0.5 ...

谢谢你的善意。

2 个答案:

答案 0 :(得分:1)

我借此机会提到其他一些细节:

arg...的第一次尝试无效,因为...语法(称为splat)将获取剩余的参数并将它们放入数组{{1 }}

默认参数的改进是:

arg

构建triangle = (arg) -> arg.base ?= 1 arg.height ?= 1 arg.base * arg.height / 2 正在使用existential operator,而?=会将arg.base ?= 1分配给1 iff arg.basearg.basenull

但它变得更好! Coffeescript支持destructuring assignment,所以你可以写:

undefined

如果您愿意,可以使用Coffeescript的默认参数:

triangle = ({base, height}) ->
    base ?= 1
    height ?= 1

    base * height / 2

但是,如果您希望能够仅指定 triangle = ({base, height} = {base: 1, height: 2}) -> base * height / 2 base,即如果您将其称为{{ {1}},height将是triangle(base: 3),所以可能不是您想要的。

答案 1 :(得分:0)

对不起,我找到了答案。我应该使用arg代替arg...

triangle = (arg) ->
    if arg.base == undefined then arg.base = 1;
    if arg.height == undefined then arg.height = 1;
    arg.base * arg.height / 2

document.writeln triangle
    base:8
    height:5 # => return 20 !!!