2011-09-12 5 views
112

CoffeeScriptが自動的にスコープ内の最後の項目を返すようです。この機能を避けることはできますか?CoffeeScriptを使用して何かを返さない方法はありますか?

+0

なぜあなたはしたいですか?あなたが好きなときに戻り値を破棄することはできませんか? – Chris

+10

@Chris:意味のある戻り値がないときは、最後のステートメントの結果であることが何らかの原因で漏れてしまうのは良い考えではありません。 – delnan

+10

@Chrisこれは、ループの戻り値が使用される場合(または関数の最後の式である場合)、coffeescriptは配列内の各反復の結果を収集する可能性があるため、comprehensions/for/whileループでもパフォーマンスに影響を与える可能性があります。 – arnaud576875

答えて

143
あなたが明示的に何も返さないために、またはあなたの関数の下部にundefinedに評価される式を残している

fun = -> 
    doSomething() 
    return 

または:

fun = -> 
    doSomething() 
    undefined 

これは、ドキュメントが推奨するもので、とき補語を使用して:

誤って理解の結果を戻さないように注意してください。これらの場合、によって、意味のある戻り値をtrueまたはnullのように追加すると、の末尾にが追加されます。


ただし、このようなラッパー記述することができます。

(ここではsplat operator...を)注意してください)と関数を定義するときに、このようにそれを使用

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

を:

fun = voidFun -> 
    doSomething() 
    doSomethingElse() 

またはこのように:

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

この有益な答えをありがとう。私も現在私がcoffeescriptを学んでいるので、これについて疑問に思っています。私はあなたが何が最善の選択か、あるいは最悪の選択が価値の復帰を妨げるときに何になるかを明らかにすることができれば好奇心が強いですか?具体的には、関数の最後に 'return'、' undefined'、 'null'のいずれかを追加するオプションがあると言われています。しかし、何らかの理由で「null」を追加するのは間違っているようです。私はそれを3人の中で最悪の選択とするのは正しいのですか? – stefmikhail

+2

javascriptでは、return文を持たない関数(または空のreturn文)は未定義を返します。そのため、空の戻り値を追加するか、末尾に 'undfined'を残すことをお勧めします。空の 'return'文を使うと、関数の終わりに' undefined'を残して*何も返さないようにするので、空の 'return'が良いオプションのようです。 – arnaud576875

+2

'fun(arguments ...)'の代わりに、 'fun.apply(this、arguments)'を呼び出すほうがよいでしょう。 –

1
longRunningFunctionWithNullReturn = -> 
    longRunningFunction() 
    null 
0

CoffeeScriptの中の関数があっても、常にnull、何かを返す必要がありそうです。 Cでは戻り値の型としてvoidがあります。 ->(空の関数)は(function() {})にコンパイルされるため、何も返さない唯一の関数です。

+0

それは当てはまりません。 'return;'はvoidの値を返すためにC、JavaScript、CoffeeScriptで動作します。 – YoYoYonnY

5

だけで何か楽しい(ctional)

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

Function.prototype自体はいつも何も返さない関数です。あなたはcomposeを使って戻り値をこのブラックホールにパイプすることができ、合成された関数は何も返さないでしょう。

10

はい、returnを関数の最後の行として使用します。あなたはコーヒーにコンパイルをJSか見てみたい場合は例えば

answer =() -> 
    42 

extrovert = (question) -> 
    answer() 

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

http://bit.ly/1enKdRlを試してみてください。 (私の例ではcoffeescript reduxを使用しました)

+1

downvoter、コメントしてください! – gprasant

+1

私はそれがdownvotedと考えています。この回答は、既にこの投票の2年前に与えられているような、一番上の投票された回答の中に既にあるものとは別の価値を追加していないからです! –

+1

しかし、この例はとてもクールです。 –