[英]how does javascript's closure work if we want to preserve a value in currying
[英]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.log
, total
具有第一个参数的值,即1。您非常聪明地打印了所有这些数字,因此它应该有助于您的理解。 确认打印出7后,您尚未完成添加的后续调用。 这就是为什么您看到1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.