web-dev-qa-db-ja.com

JavaScript関数はそれ自体を返すことができますか?

自分自身を返す関数を書くことはできますか?

クロージャについての説明を読んでいました--- 例6を参照 -関数が関数を返していたので、有効なJavaScriptとしてfunc()();を呼び出すことができました。

だから私は、関数が次のように無期限にそれ自体にチェーンできるような方法でそれ自体を返すことができるのだろうかと思っていました:

func(arg)(other_arg)()(blah);

argumentsオブジェクト、呼び出し先、または呼び出し元を使用していますか?

27
fbas

2〜3の方法があります。 1つは、あなたが言うように、arguments.calleeを使用することです。どこかに(あなたが知っている)変数に割り当てられて保存されていない無名関数を扱っている場合、それが唯一の方法かもしれません:

(function() {
    return arguments.callee;
})()()()().... ;

2つ目は、関数の名前を使用することです

function namedFunc() {
    return namedFunc;
}
namedFunc()()()().... ;

最後は、変数に割り当てられた無名関数を使用することですが、変数を知っている必要があるため、その場合、関数に名前を付けることができない理由がわかりません。上記の方法を使用してください。

var storedFunc = function() {
    return storedFunc;
};
storedFunc()()()().... ;

これらはすべて機能的に同じですが、calleeが最も単純です。

編集:そして私はSLaksに同意します。私もお勧めできません

32
Flambino

はい。
ただreturn arguments.callee;


ただし、これによりコードが非常に混乱する可能性があります。私はそれをお勧めしません。

10
SLaks

あなたは次のようにあなたがしたいことをすることができます:

// Do definition and execution at the same time.
var someFunction = (function someFunction() {

    // do stuff
    return someFunction
 })();

 console.log(someFunction)

arguments.callee JavaScriptの厳密モードではサポートされていません。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

6
ataru

上記のすべてが次のようなソーターですら:

f=()=>f
1
מתן ל

これを実現するには、次の簡単な方法があります。

let intArr = [];
function mul(x){
    if(!x){
        return intArr.reduce((prev, curr) => prev * curr)
    }
    intArr.Push(x);
    return mul;
}

console.log(mul(2)(4)(2)()); => outputs 16
0
zero_cool

次のような自己呼び出し可能な関数の引数を返すだけでも可能です。

console.log( (function(a) {  return a; })(1) ); // returns 1
0
konstantin555