Scope функции
Подскажите, пожалуйста. Сейчас функция работает как надо. Но если у функции worker убрать аргумент, то вылетает ошибка - глубина стека превышена. Почему так происходит? Вроде же функция запоминает свое окружение и может дотянуться до аргумента первой функции (collapse).
const data = {
a: {
b: [1, 2],
c: {
d: 3,
f: {
j: [20, 30]
}
}
},
h: 4
};
function checkType(value) {
const type = Object.prototype.toString.call(value);
return type.substring(8, type.length - 1);
}
function collapse(obj) {
const result = {};
let temp = '';
function worker(obj) {
for (let prop in obj) {
if (checkType(obj[prop]) == 'Object') {
temp += prop + '.';
worker(obj[prop]);
temp = '';
} else if (checkType(obj[prop]) == 'Array') {
for (var i = 0; i < obj[prop].length; i++) {
let s = temp;
s += prop + '.' + [i];
result[s] = obj[prop][i];
s = '';
}
} else {
result[temp + prop] = obj[prop];
}
}
}
worker(obj);
return result;
}
console.log(collapse(data));
|
Если убрать параметр для worker, то внутри worker всегда будет обращение к тому obj, который параметр для collapse. А он не меняется и потому всегда будет происходить рекурсивный вызов, до переполнения.
Сейчас worker обращается к своему параметру obj, он всякий раз новый и рано или поздно станет не объектом (если, конечно, в твоем объекте нет кольцевых ссылок) |
Alexandroppolus, точно. Спасибо. Затупил чет :D
|
| Часовой пояс GMT +3, время: 05:13. |