【问题标题】:Is there any way to not return something using CoffeeScript?有没有办法不使用 CoffeeScript 返回一些东西?
【发布时间】:2011-11-15 12:43:42
【问题描述】:

CoffeeScript 似乎会自动返回范围内的最后一项。我可以避免这个功能吗?

【问题讨论】:

  • 您为什么要这样做?不能随意丢弃返回的值吗?
  • @Chris:当没有有意义的返回值时,泄漏最后一条语句的结果不是一个好主意。
  • @Chris 这也可能对理解 / for / while 循环产生性能影响,因为如果使用循环的返回值(或者如果它是函数的最后一个表达式)
  • 我刚刚遇到了一个承包商的问题。我在构造函数的最后一行定义了一个函数。所以这是返回而不是我的“类函数”。我必须明确地返回这个。只是说,这可能是个问题。

标签: coffeescript


【解决方案1】:

是的,return 作为函数的最后一行。

例如,

answer = () ->
  42

extrovert = (question) -> 
  answer()

introvert = (question) ->
  x = answer()
  # contemplate about the answer x
  return 

如果您想查看咖啡编译成的 js,请尝试 http://bit.ly/1enKdRl。 (我的示例使用的是 coffeescript redux)

【讨论】:

  • 我认为它被否决了,因为除了最高投票答案中已经存在的答案之外,这个答案没有增加任何价值,而这个答案恰好在这个答案之前 2 年给出!
【解决方案2】:

只是一些有趣的东西(实用的)

suppressed = _.compose Function.prototype, -> 'do your stuff'

Function.prototype 本身就是一个始终不返回任何内容的函数。您可以使用 compose 将您的返回值通过管道传输到这个黑洞中,并且组合函数将永远不会返回任何内容。

【讨论】:

    【解决方案3】:

    您必须显式地不返回任何内容,或者在函数底部留下一个评估为 undefined 的表达式:

    fun = ->
        doSomething()
        return
    

    或者:

    fun = ->
        doSomething()
        undefined
    

    这是文档在使用推导时的建议:

    请注意,在这些情况下,通过添加有意义的返回值(例如 true)或 null,到函数底部,不要意外返回推导式的结果


    但是,您可以像这样编写包装器:

    voidFun = (fun) ->
        ->
            fun(arguments...)
            return
    

    (注意这里的splat operator (...))

    并在定义函数时这样使用:

    fun = voidFun ->
        doSomething()
        doSomethingElse()
    

    或者像这样:

    fun = voidFun(->
        doSomething()
        doSomethingElse()
    )
    

    【讨论】:

    • 感谢您提供的信息丰富的回答。我也一直想知道这一点,因为我目前正在学习咖啡脚本。我很好奇您是否可以阐明在阻止返回值时最好的选择或最坏的选择是什么?具体来说,有人告诉我选项是在我的函数末尾添加returnundefinednull。但是,由于某种原因,添加null 对我来说似乎是错误的。我认为它是三者中最糟糕的选择是否正确?
    • 在 javascript 中,没有 return 语句(或空的 return 语句)的函数返回未定义,因此最好的选择是添加一个空的 return 或在末尾留下一个 undfined。使用空的return 语句似乎比在函数末尾留下undefined 更好地表达return nothing,因此空的return 似乎是更好的选择。
    • 而不是fun(arguments...),最好打电话给fun.apply(this, arguments)
    • 其实“return”和“undefined”生成不同的javascript。在coffeescript.org 使用“Try Coffeescript”,可以看到在coffeescript 中明确包含“return”会删除javascript 的返回;而对于“未定义”,javascript 函数以“return void 0;”结束
    • 我认为您可能需要小心使用 voidFun,因为我怀疑内部函数仍会返回它想要的任何内容,这可能会导致性能下降。
    【解决方案4】:

    CoffeeScript 中的函数似乎必须总是返回一些东西,即使是null。在 C 中,您有 void 作为返回类型。 ->,空函数,编译成(function() {}),所以它是唯一不返回任何东西的函数。

    【讨论】:

    • 这不是真的。 return; 在 C、JavaScript 和 CoffeeScript 中工作以返回一个 void 值。
    【解决方案5】:
    longRunningFunctionWithNullReturn = ->
      longRunningFunction()
      null
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2018-02-18
      • 1970-01-01
      相关资源
      最近更新 更多