Я перебирал эту функцию снова и снова в Chrome отладчике и до сих пор не могу понять, что делает return a
. Спасибо за помощь!
Вот несколько уточнений: я понимаю первый раунд. Анонимная функция вызывается со следующими параметрами:
active = "", rest = "ab c", a = []
Затем вызывается сама til rest
пусто, когда он заполняет массив a
:
active = "ab c", rest = "", a = ["ab c"]
В этот момент мы достигаем return a
, и отладчик переходит ко второму вызову fn в операторе else вместо первого оператора if. Параметры уже выглядят так:
active = "ab", rest = "c", a = ["ab c"]
This это та часть, которую я совсем не понимаю. Я знаю, что рекурсия заканчивается, только когда active
и rest
пустые, но после return a
операторы if даже не проверяются в отладчике, он просто выделяет упомянутый второй вызов функции, и в этот момент " c "уже присвоен rest
. Я предполагаю, что причина, почему эта функция не производит дубликаты, также лежит здесь, но это может быть другой вопрос, если нет. В любом случае, еще раз спасибо за помощь!
combinations("abc");
function combinations(str) {
var fn = function(active, rest, a) {
if (!active && !rest)
return;
if (!rest) {
a.push(active);
} else {
fn(active + rest[0], rest.slice(1), a);
fn(active, rest.slice(1), a);
}
return a;
}
return fn("", str, []);
}