function fibonacci(n) {
return (function(a, b, i) {
return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
})(1, 1, 1);
}
嘿,我是菜鸟,我能理解这个函数的数学逻辑部分,我不明白的是参数传递进度,它传递(1,1,1)到函数(abi),这似乎不太正常。
function fibonacci(n) {
return (function(a, b, i) {
return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
})
regular function pass a parameter like the way function(1 1 1)
}
我无法理解这一点,我试图将其抽象为最终的
function fibonacci(n){
return()()
}
格式,但是这怎么能传递参数,我想这是关于返回调用无法处理函数调用之后的事情,它也适用于它。
那么,我还没有学到一些基本的东西吗?像某些默认格式,如MDN中的条目?
Thnx很多。
答案 0 :(得分:1)
return (function(a, b, i) { return (i < n) ? arguments.callee(b, a + b, i + 1) : a; })(1, 1, 1);
是一个立即调用的匿名函数表达式。围绕它的括号are not required。
不推荐使用arguments.callee
,最好使用命名函数表达式编写:
return (function recurse(a, b, i) {
return (i < n) ? recurse(b, a + b, i + 1) : a;
})(1, 1, 1);
等同于函数声明和调用
function recurse(a, b, i) {
return (i < n) ? recurse(b, a + b, i + 1) : a;
}
return recurse(1, 1, 1);
答案 1 :(得分:1)
你的最终抽象是错误的。它不是return()()
,而是:
return ( function(){} )()
请注意()
不属于return
,因为return
不是函数。在这种情况下,()
充当分组括号。以同样的方式使用它:
return (1+1)*2
这里,在*2
后面添加()
是有效的,因为括号不是函数调用的一部分,而是用作分组运算符。或者更准确地说,是表达式评估器。
你看,(1+1)*2
如何工作是()
被识别为不是函数调用的一部分,因此它的内容被视为表达式。所以它被解析为:
temporary_variable = 1+1;
temporary_variable * 2;
以同样的方式,(function(){})()
被解析为:
temporary_variable = function(){};
temporary_variable();
因此,整个过程基本上都是这样做的:
function f (n) {
temporary_variable = function (a,b,i) {
/* ... */
}
return temporary_variable(1,1,1);
}