Может ли функция JavaScript возвращать себя? - PullRequest
25 голосов
/ 05 августа 2011

Могу ли я написать функцию, которая возвращает себя снова?

Я читал некоторое описание о замыканиях - см. Пример 6 - где функция возвращала функцию, поэтому вы могли вызвать func()(); как действительный JavaScript.

Поэтому мне было интересно, могла бы функция возвращать себя таким образом, чтобы вы могли бесконечно связывать ее с собой, например:

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

Используя arguments объект,вызываемый или вызывающий абонент?

Ответы [ 6 ]

31 голосов
/ 05 августа 2011

Есть 2-3 способа.Одним из них, как вы говорите, является использование arguments.callee.Это может быть единственный способ, если вы имеете дело с анонимной функцией, которая не сохранена и не присвоена какой-либо переменной (о которой вы знаете):

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

2-й - использовать имя функции

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

И последнее - использовать анонимную функцию, назначенную переменной, но вы должны знать переменную, поэтому в этом случае я не вижу причин, почему вы не можете просто дать функции имя,и используйте метод выше

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

Все они функционально идентичны, но callee является самым простым.

Редактировать: И я согласен с SLaks;Я тоже не могу рекомендовать это

10 голосов
/ 05 августа 2011

Да.
Всего return arguments.callee;


Однако это может привести к очень запутанному коду; Я не рекомендую это.

6 голосов
/ 31 октября 2015

Вы можете делать, что хотите, следующим образом:

// 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

0 голосов
/ 08 августа 2018

Еще сортировщик, что все вышеперечисленное:

f=()=>f
0 голосов
/ 25 августа 2017

Также возможно просто вернуть аргумент самозовершаемой функции, например

console.log( (function(a) {  return a; })(1) ); // returns 1
0 голосов
/ 17 августа 2017

Для этого есть простой способ:

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
...