【发布时间】:2016-07-17 12:40:18
【问题描述】:
我遇到了 this stackoverflow question 关于递归展平 JS 数组的问题。这是公认的答案:
function flatten() {
var flat = [];
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] instanceof Array) {
flat.push.apply(flat, flatten.apply(this, arguments[i]));
} else {
flat.push(arguments[i]);
}
}
return flat;
}
flatten([[1], 2, [3, 4]]); // returns [1, 2, 3, 4]
我无法理解 flat.push.apply(...) 和 flatten.apply(...) 的工作原理。
我知道只有当数组中的 none 项是数组本身时,该函数才会退出。我也了解Function.prototype.apply() 允许您使用参数数组调用函数。
我不明白为什么你使用flat.push... 如果flat 将在每次函数迭代中设置为[]。另外,将flat 设置为this 上下文有什么意义?
有人可以帮助解释flat.push.apply(flat, flatten.apply(this, arguments[i])); 的执行是如何工作的吗?
【问题讨论】:
-
"如果
flat在每次函数迭代时都设置为[]。" - 这不是迭代,而是递归。每个调用都有自己的局部变量。 -
“将
flat设置为this上下文有什么意义?”——这是push方法的上下文,即将被推送的数组。就像你定期调用flat.push(…)onflat。 -
flat不是每次迭代都设置,它只设置一次,在循环之前。 -
那么递归的执行栈是如何工作的,它与迭代的执行栈有什么不同呢?
-
为什么?
r=[];r.push([1]);r;生成[[1]],而r=[];r.push.apply(r,[1]);r;生成[1]
标签: javascript arrays recursion