首页 > 解决方案 > 闭包和柯里化中的引用如何在 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 = function (b) {...} 中,“return _fn”语句中的 _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和控制台显示的值有冲突。

标签: javascriptecmascript-6closurescurrying

解决方案


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

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

如果它引用自己,那么它不是像这样无限递归吗......

不,因为返回值,函数,不会立即被调用。有点像这样做:

function g() {return g}
g()

运行不会进入无限循环。你调用函数g,你得到g。你可以g()()()()()()()自己做,但这仍然“停止”。递归是函数调用自身,而不是返回自身!

在控制台中,它显示“_fn:1”,这意味着返回了 1,但显然,返回了 _fn(函数),以便计算可以继续进行。所以实际返回的_​​fn和控制台显示的值有冲突。

好吧,说 1 被退回可能是不正确的;相反,代码强制所有console.logs (和类似的)产生 的当前值total。在你做你的时候console.logtotal你的第一个参数的值是1。你很聪明地打印出所有这些数字,所以它应该有助于你的理解。检查在打印 7 之后,您还没有完成添加完成的后续调用。这就是你看到1的原因。


推荐阅读