受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
?我错过了什么?
答案 0 :(得分:2)
应该是
return fn(n);
因为JavaScript需要一个显式的return语句。
答案 1 :(得分:2)
fn(n)
返回到通话点。您的实际函数chainableCounter
没有返回任何内容,它没有返回语句。
您可以在调用fn
之前添加它,如下所示:
return fn(n);