Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Scope функции (https://javascript.ru/forum/misc/85572-scope-funkcii.html)

firep91613 24.10.2023 19:59

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));

Alexandroppolus 24.10.2023 20:13

Если убрать параметр для worker, то внутри worker всегда будет обращение к тому obj, который параметр для collapse. А он не меняется и потому всегда будет происходить рекурсивный вызов, до переполнения.

Сейчас worker обращается к своему параметру obj, он всякий раз новый и рано или поздно станет не объектом (если, конечно, в твоем объекте нет кольцевых ссылок)

firep91613 24.10.2023 20:28

Alexandroppolus, точно. Спасибо. Затупил чет :D


Часовой пояс GMT +3, время: 06:25.