Javascript:关于斐波那契函数中的Return()()格式尾递归

Javascript: About Return()() format tail recursion in Fibonacci function

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)传递给函数(a b i),这似乎不太正常。

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()()
}

格式,但这怎么能传递参数,我猜这是关于 return 调用无法处理它之后的函数调用的问题,它也适用于它。

那么,是不是有些基础的东西我没有学呢?喜欢一些默认格式,比如 MDN 中的条目?

非常感谢。

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);

你最后的抽象是错误的。不是 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);
}