我能写一个返回自己的函数吗?
我阅读了关于闭包的一些描述-请看例子6-其中一个函数返回了一个函数,这样你可以调用func()();
作为有效的JavaScript。
所以我在想是否可以编写一个函数以这种方式返回它本身,从而可以无限地将其链接到自身,如下:
func(arg)(other_arg)()(blah);
使用arguments
对象、callee
还是caller
?
我能写一个返回自己的函数吗?
我阅读了关于闭包的一些描述-请看例子6-其中一个函数返回了一个函数,这样你可以调用func()();
作为有效的JavaScript。
所以我在想是否可以编写一个函数以这种方式返回它本身,从而可以无限地将其链接到自身,如下:
func(arg)(other_arg)()(blah);
使用arguments
对象、callee
还是caller
?
有2-3种方法。其中一种就是,如你所说,使用arguments.callee
。如果你正在处理一个未被存储为变量的匿名函数(至少你不知道它在哪里被分配),这可能是唯一的方法:
(function() {
return arguments.callee;
})()()()().... ;
第二种方法是使用函数的名称。function namedFunc() {
return namedFunc;
}
namedFunc()()()().... ;
最后一种方法是使用分配给变量的匿名函数,但您必须知道该变量,因此在这种情况下,我看不出为什么您不能给函数一个名称,并使用上述方法。
var storedFunc = function() {
return storedFunc;
};
storedFunc()()()().... ;
它们在功能上都是相同的,但是callee
是最简单的。
编辑:我也同意SLaks的观点,我也不建议使用它。
arguments.callee
会抛出一个错误。http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ - Mark Fox(function X() {return X;})()()()().... ;
来消除被调用者的使用,从而减轻弃用问题。函数名也会在堆栈跟踪中出现。它简洁、符合规范,不会污染命名空间。 - Moika Turns是的。
只需返回 arguments.callee;
但是,这可能会导致非常混乱的代码;我不建议使用。
arguments.callee
:1. 实现通常会对函数进行优化,如果不使用arguments
对象,则通常不会创建它(执行上下文将更快地初始化)-当然,如果函数使用eval
,则通常无法进行优化-。2. ES5严格模式中arguments
对象有所改变,并且arguments.callee
属性已被禁用(同样出于优化和安全考虑),因此基本上为编写具有未来性的代码,我建议只使用函数名称。 :) - Christian C. Salvadócallee
不再被允许使用了吗?我记得应该是 caller
。 - SLakscaller
实际上从未成为规范的一部分,但是它被许多实现支持,这就是为什么在ES5中,对于严格模式下的函数,caller
和callee
都被赋值为一个thrower function,请参见10.6 Arguments Object中的Step 14。 - Christian C. Salvadó// 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
f=()=>f
{}
来添加此箭头函数的逻辑,例如:
const f = () => { console.log('test'); return f }
- Jakublet 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
还有一种可能,就是像自调用函数那样直接返回参数。
console.log( (function(a) { return a; })(1) ); // returns 1