Javascript可连接关闭

时间:2015-08-23 21:20:07

标签: javascript closures chainable

If Hemingway Wrote Javascript的启发,我正在尝试使用私有局部变量编写一个可链接的函数闭包。

预期的行为是:

> chainableCounter()
0
> chainableCounter(1)(2)()
3

这是我的代码:

function chainableCounter(n) {
    var acc = 0;

    var fn = function (x) {
        if (x === undefined) {
            return acc;
        } else {
            acc = acc + x;
            return fn;
        }
    };

    fn(n);
}

当我尝试在节点REPL中运行它时,这就是我得到的:

> chainableCounter()
undefined
> chainableCounter(1)
undefined
> chainableCounter(1)()
TypeError: undefined is not a function

chainableCounter(1)返回undefined而不是函数对象似乎表明我们从未遇到过return fn;行。但更重要的是,为什么chainableCounter()在返回undefined时还会返回0?我错过了什么?

2 个答案:

答案 0 :(得分:2)

应该是

return fn(n);

因为JavaScript需要一个显式的return语句。

答案 1 :(得分:2)

fn(n)返回到通话点。您的实际函数chainableCounter没有返回任何内容,它没有返回语句。

您可以在调用fn之前添加它,如下所示:

return fn(n);