Может ли функция JavaScript вернуться сама?
Могу ли я написать функцию, которая возвращает его?
Я читал некоторое описание на закрытии - см. пример 6 - где функция возвращала функцию, поэтому вы могли бы вызвать func()();
как действительный JavaScript.
Итак, мне было интересно, может ли функция вернуть себя таким образом, что вы могли бы привязать ее к себе бесконечно следующим образом:
func(arg)(other_arg)()(blah);
Использование объекта arguments
, вызываемого абонента или вызывающего абонента?
Ответы
Ответ 1
Есть 2-3 пути. Один из них, как вы говорите, заключается в использовании arguments.callee
. Это может быть единственный способ, если вы имеете дело с анонимной функцией, которая не хранится назначенной переменной где-то (что вы знаете):
(function() {
return arguments.callee;
})()()()().... ;
Второй должен использовать имя функции
function namedFunc() {
return namedFunc;
}
namedFunc()()()().... ;
И последнее заключается в использовании анонимной функции, назначенной переменной, но вы должны знать эту переменную, поэтому в этом случае я не вижу причин, почему вы не можете просто дать функции имя и использовать метод выше
var storedFunc = function() {
return storedFunc;
};
storedFunc()()()().... ;
Все они функционально идентичны, но callee
является самым простым.
Изменить: И я согласен с SLaks; Я не могу рекомендовать его
Ответ 2
Да.
Просто return arguments.callee;
Однако это, вероятно, приведет к очень запутанному коду; Я не рекомендую его.
Ответ 3
Вы можете сделать то, что хотите:
// 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
Ответ 4
Существует простой способ добиться этого, выполнив следующие действия:
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
Ответ 5
Также можно просто вернуть аргумент self invokable function like
console.log( (function(a) { return a; })(1) ); // returns 1