我遇到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