13

私は 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 {
        // ...
    }
};

最初のケースで空のオブジェクトを返すのは意味がありませんか?

4

6 に答える 6

20

「純粋な」関数型プログラミング環境には副作用がありません。各関数の作業は、その戻り値を計算することだけです。これは、Javascript の典型的な使用法では実際には実行可能ではないため、関数が副作用を介してその作業を完了した場合、何も返さない、つまり、関数ではなく「プロシージャ」にすることは完全に許容されます。

于 2009-05-24T05:10:00.563 に答える
5

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

関数の学術的な説明によると、関数は、与えられた入力と同じ出力を与えなければなりません。関数には副作用がないと想定されているため、出力を持たない関数はまったく役に立ちません。

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

于 2009-05-24T05:37:11.060 に答える
2

何も返さない関数があっても問題ありません。実際、本来戻り値を持たないはずの関数に戻り値を持たせるのは、厄介であり、悪臭を放ちます。

于 2009-05-24T05:08:18.410 に答える
1

副作用のみを生成する関数は、プロシージャ ブロックと同じように、単に分離されたプログラム ブロックと見なすことができます。JS にはプロシージャがないため、関数をプロシージャ ブロックとして使用しても問題はありません。JS の関数もオブジェクトであるという唯一の例外があるため、そのような「関数」を多用する場合は注意してください。

この場合、プログラムの可読性が向上します。

于 2009-05-24T10:58:12.897 に答える
0

の結果を使用することになっていない場合は、LIB_hashManager確実に返す必要があると思いますundefined(つまり、returnステートメントはまったくありません)。

これを忘れて、とにかく関数の結果を使おうとすると、おそらくエラーが発生するだけです(プログラミングエラー、バグになるので問題ありません!)

于 2009-05-24T06:45:31.470 に答える