我遇到this stackoverflow question关于递归平展JS数组。这里是公认的答案:递归Function.prototype.apply概念理解
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(...)
工作。
据我所知,该函数只有在数组中的项为无时才会退出。我也明白Function.prototype.apply()
允许你使用一个参数数组来调用一个函数。
我不明白的是,为什么你使用flat.push...
如果flat
将被设置为[]
在每个函数迭代。另外,设置flat
作为this
上下文有什么意义?
有人可以帮忙解释flat.push.apply(flat, flatten.apply(this, arguments[i]));
的执行是如何工作的吗?
“* if'flat'将在每个函数迭代中设置为'[]'*” - 它不是迭代,它是递归。每个调用都有自己的局部变量。 – Bergi
“*设置'flat'作为这个上下文有什么意义?*” - 这是'push' *方法的上下文,它是将被推入的数组。就像您经常在'flat' *上调用'flat.push(...)'*一样。 – Bergi
'flat'每次迭代都没有设置,它只在循环之前设置一次。 – dandavis