繁体   English   中英

js中的闭包和Curying参考如何工作?

[英]How does a reference in closure and currying work in js?

以下程序使我非常困惑,console.log()是我添加的。

function add(a) {
    console.log("1");
    var total = a;
    console.log("2");
    var _fn = function (b) {
        console.log("3");
        total += b;
        console.log("4");
        return _fn;
    };
    console.log("5");
    _fn.toString = _fn.valueOf = function () {
        console.log("6");
        return total;
    };
    console.log("7");
    console.log("_fn: " + _fn);
    return _fn;
}

当我运行add(1)(2)时,控制台显示:

1
2
5
7
6
_fn: 1
3
4
6
ƒ 3

我的问题是:

1)在var _fn =函数(b){...}中,_fn在“ return _fn”语句中指的是什么? 如果它指向自身,那么它不是像这样的无限递归吗?

var _fn = function (b) {
    total += b;
    return function (b) {
        total += b;
        return function (b) {
            total += b;
            return _fn;
            .
            .
            .
        }
    }
}

2)在控制台中,它显示“ _fn:1”,这意味着返回了1,但显然,已返回_fn(该函数),以便继续进行计算。 因此,实际返回的_​​fn与控制台中显示的值之间存在冲突。

在var _fn =函数(b){...}中,_fn在“ return _fn”语句中指的是什么?

return语句表示在调用此函数时,该函数的返回值将是该函数对象本身(的引用)。 注意,它返回函数对象, 而不调用它 只是对象,没有电话。 至少还没有。

如果它指的是自己,那么它不是像这样的无限递归...

不可以,因为不会立即调用该函数的返回值。 有点像这样:

function g() {return g}
g()

运行不会陷入无限循环。 您调用函数g,然后返回g。 您可以自己执行g()()()()()()() ,但这仍然“停止”。 递归是函数调用自身而不返回自身时!

在控制台中,它显示“ _fn:1”,这意味着返回了1,但很显然,已返回_fn(该函数),以便继续进行计算。 因此,实际返回的_​​fn与控制台中显示的值之间存在冲突。

好吧,说1已经退货可能是不正确的; 相反,代码强制所有console.log (以及类似的东西)产生total的当前值。 在您执行console.logtotal具有第一个参数的值,即1。您非常聪明地打印了所有这些数字,因此它应该有助于您的理解。 确认打印出7后,您尚未完成添加的后续调用。 这就是为什么您看到1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM