javascript - 闭包和柯里化中的引用如何在 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和控制台显示的值有冲突。
解决方案
在 var _fn = function (b) {...} 中,“return _fn”语句中的 _fn 指的是什么?
return 语句表示当调用此函数时,函数的返回值将是(对)函数对象本身的(引用)。请注意,它返回函数对象,而不调用它。只是对象,没有调用。至少现在还没有……
如果它引用自己,那么它不是像这样无限递归吗......
不,因为返回值,函数,不会立即被调用。有点像这样做:
function g() {return g}
g()
运行不会进入无限循环。你调用函数g,你得到g。你可以g()()()()()()()
自己做,但这仍然“停止”。递归是函数调用自身,而不是返回自身!
在控制台中,它显示“_fn:1”,这意味着返回了 1,但显然,返回了 _fn(函数),以便计算可以继续进行。所以实际返回的_fn和控制台显示的值有冲突。
好吧,说 1 被退回可能是不正确的;相反,代码强制所有console.log
s (和类似的)产生 的当前值total
。在你做你的时候console.log
,total
你的第一个参数的值是1。你很聪明地打印出所有这些数字,所以它应该有助于你的理解。检查在打印 7 之后,您还没有完成添加完成的后续调用。这就是你看到1的原因。
推荐阅读
- iphone - 长时间连接 Wifi 到 ESP8266 到 iOS
- apache - 如何在 htaccess 中为文件夹禁用 gzip 压缩
- ionic-framework - 一代 Apk 离子
- python - 增加集合 pymongo 中所有对象的所有字段
- string - 将 VB.Net CSV 文件读入列表的问题,缺少一半的值
- angular - 在 Ag-Grid 中使用 col-id 删除默认类
- python - 将 JSON 键值导入 pandas 数据框错误
- typescript - 为什么返回类型中的泛型类型参数 T “未知”?如何键入此函数以便正确推断返回类型?
- numpy - 如何在 Python 中从特定轴中选择数组元素
- visual-studio - 可以使用 Visual Studio C++ 头文件/lib 文件在没有安装 Visual Studio 的机器上构建吗?