11

JavaScriptコードを記述しており、その機能的な言語の性質を使用しようとしています。私はいつも関数に戻り値を与えるべきですか?

他の関数型言語(またはRubyでも)では、関数の戻り値を明示的に設定しないと、最後に評価された式の値が返されます。 JavaScriptはこのパターンに従いません。 (正確には、JavaScriptは常に値も返します。何も設定されていない場合は、undefined

私の質問は次のとおりです。私は値を返す必要がない関数を持っています。関数型プログラミングコンテキストでは、明示的な戻り値のない関数を持つことは意味がありますか?この場合、私が自分自身を見つけたら、どこかで失敗しましたか?

たとえば、次のような機能があります。ロケーションハッシュが変更されたかどうかを定期的にチェックし、存在する場合は指定された関数を呼び出します。

LIB_hashManager = function(f, context) { 
    var prev = ''; 
    var pollHash = function() { 
     if (prev !== window.location.hash) { 
      prev = window.location.hash; 
      f.apply(context); 
     } 
    }; 
    window.setInterval(pollHash, 100); 
}; 

私はここに何かを返すべきですか?更新

。一方、それはいつでも、将来的に私は、機能コンストラクタパターン次LIB_hashManagerの知識を拡張する必要がありますならば、私は単にオブジェクトにメソッドを追加することができ、私の心に来て、 LIB_hashManagerは生成されたオブジェクトを返します。

LIB_hashManager = function(f, context) { 
    // inside logic 
    // ... 
}; 

以降、私は書くことがあります。

LIB_hashManager = function(f, context) { 
    // inside logic 
    // ... 

    // return public methods 
    return { 
     // ... 
    } 
}; 

だから最初のケースでは、空のオブジェクトを返すために、その後意味がありませんか?

答えて

18

"純粋な"関数プログラミング環境では副作用がなく、各関数の戻り値の計算には完全にになります。それはJavaScriptの典型的な使用では実際には実現可能ではないため、関数が副作用を介して作業を完了したときに、何も返さない、つまり関数ではなく「手続き」にすることは全く受け入れられます。

+15

ハスケルのクリエイターの一人が言ったように(言い換えれば)「マシン全体が純粋に機能的なアプローチで実行されていれば、そのマシンから抜け出すのは熱い箱になります。実際に結果を見ることは決してありませんそれは計算した "。 :) –

2

何も返さない関数を持つのはまったく問題ありません。実際には、自然に戻り値を持たない関数には厄介なものがあり、は悪い臭いがあります

+0

は、それはそれは、私たちが話している言語で呼び出された場合でも、関数ではありません。 – Ingo

5

私の質問は次のとおりです。私は値を返す必要がない(そして返さない)関数を持っています。関数型プログラミングコンテキストでは、明示的な戻り値のない関数を持つことは意味がありますか?この場合、私が自分自身を見つけたら、どこかで失敗しましたか?

関数の学術的な記述によれば、関数は入力が与えられたときに同じ出力を与えなければなりません。関数には副作用がないと考えられるので、出力を持たない関数は全く役に立たない。

しかし、関数型プログラミング言語はしばしば少なくとも1つの副作用を必要とするため、何も返さないという慣習はユニットまたは "()"を返すことです。このコンセプトはJavascriptには存在しないので、Javascriptは強く型付けされていないので、あなたにとって重要ではありません。

0

LIB_hashManagerの結果を使用する予定がない場合は、間違いなくundefinedを返す必要があります(つまり、返信文が一切ありません)。あなたはこれを忘れて、とにかくあなたはおそらくエラー取得します関数の結果を使用しようとする

(つまり、プログラミングエラー、バグだろうので、大丈夫です!)

1

生成機能副作用のみが、プロシージャブロックと同じように、単離されたプログラムブロックとみなされてもよい。 JSには手続きがないので、手続きブロックとして関数を使うのは間違いありません。 JS内の関数がオブジェクトであるという唯一の例外なので、そのような '関数'の広範な使用には注意してください。

この場合、プログラムの読みやすさが向上します。

0

この質問は4年以上前に回答されているが、私は、受け入れ答えは間違っ

与えられたコードで

であると信じて、著者が設定間隔とその後 - 彼はANYを提供していませんそれを止める方法。

だから答えは次のようになります。 はい、あなたはこの機能から値を返す必要があり、その値は、その中に開始されますが、間隔を停止することができ、オブジェクト、でなければなりません。

詳細については、を参照してください。を実装する必要があります。 //インターバルハンドラを返すか、または手動で取り消すことができます(例1を参照)。または、シーンの背後にあるメソッドを持つオブジェクトを返します(.pause.stopまたは.cancelなど)。あるいは、そのオブジェクトは、(間隔の頻度を変えるように)ハッシュマネージャの実行時の再構成を可能にすることもできます。

例1(シンプル):それは、戻り値を持たない場合

LIB_hashManager = function(f, context) { 
    var prev = ''; 
    var pollHash = function() { 
     if (prev !== window.location.hash) { 
      prev = window.location.hash; 
      f.apply(context); 
     } 
    }; 
    return window.setInterval(pollHash, 100); 
}; 
関連する問題