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, время: 06:25. |