4

通常、私はフォームによって達成される関数クロージャを見ます

var closedF = (function()
{
    return function(){/* return value */}
})();

そのため、呼び出しclosedF()は内部関数からの戻り値を返します。closedFしかし、解析時に定義されるように、関数宣言(上記は関数式です)を使用して作成したいと思います。つまり

function closedF()
{
    return function(){/* return value */}
}

closedF()ただし、これを呼び出すと、内部関数の戻り値ではなく内部関数が返されるため、これは機能しません。注:上記の宣言で使用できますclosedF()()が、それはエレガントではありません。

これは可能ですか?

psいつものように、特定のプログラミングの問題を解決する方法はたくさんありますが、実際には、クローズドオーバー関数はJSの「二級市民」関数ではないことを誰かに見せてもらいたいです。

4

4 に答える 4

3

あなたの問題は必ずしも関数式と関数宣言とは何の関係もありません。

どちらの場合も、内部関数の戻り値は取得されません。

内部関数を呼び出すだけで取得でき、その値を返すことができます。

function closedF() {
    return (function(){
        /* return value */
    }()); // <- calling the inner function here
}

欠点は、外部関数を呼び出すときに、内部関数が常に新しく定義されることです。内部関数を外部関数のプロパティとしてキャッシュすることで、これを防ぐことができます。

function closedF() {
    var func = closedF.__func ||  (closedF.__func = function(){
        /* return value */
    });
    return func();
}

ただし、これは役立つというよりも混乱を招く可能性があります。

@James Longが彼の答えに示しているように、より簡単なのは、外部関数をすぐに実行し、返された関数を変数に割り当てることです。

アップデート:

これを行うこともできます:

(function() {
    window.closedF = function() {

    };
}());

どちらも関数式ですが

于 2011-07-08T20:42:55.847 に答える
2

これは不可能です。クロージャ内から関数を取得する唯一の方法は、実際にラッピング関数を実行することです。これは、もちろん、コンパイル中には実行できません。

実際に探しているコードは次のとおりです。

var closedF = function(){
    return function(){
       // do stuff
    }
}(); // <-- note the (), which immediately calls the outer function

最終的に、あなたが求めているものの有効なユースケースすらありません。クロージャのポイントは、プログラムの実行中に渡された、特定の関数で使用可能な外部変数への参照を取得できることです。コンパイル中にこれを実行しようとしている場合は、coeがまだ実行されていないため、取得しようとしているものすべてにすでにアクセスできます。したがって、閉鎖の必要はありません。

自分がやろうとしていることを正確に投稿する場合は、別の解決策があるかもしれません。

于 2011-07-08T20:40:10.773 に答える
1

あなたはこのようなものを意味します:

function closedF() {
    return function () {
    }
}

うん、それは完全に許容できる

編集:コメントを読んで、自己実行型の無名関数が必要だと思います:

var closedF = (function () {
    return function () {
    };
}());

これにより、を呼び出すだけで簡単に実行できる関数が作成されますがclosedF()、宣言として可能かどうかはわかりません。

于 2011-07-08T20:02:19.763 に答える
1

関数をパラメーターとして渡すことを検討しましたか?

function closedF(fn){
    return fn;
}

そしてそれを使用するには:

var fnParam = function(){...};
...
closedF(fnParam);
于 2011-07-08T20:10:40.287 に答える