Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.10.2023, 19:59
Аспирант
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 24.10.2023
Сообщений: 58

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));
Ответить с цитированием
  #2 (permalink)  
Старый 24.10.2023, 20:13
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

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

Сейчас worker обращается к своему параметру obj, он всякий раз новый и рано или поздно станет не объектом (если, конечно, в твоем объекте нет кольцевых ссылок)
Ответить с цитированием
  #3 (permalink)  
Старый 24.10.2023, 20:28
Аспирант
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 24.10.2023
Сообщений: 58

Alexandroppolus, точно. Спасибо. Затупил чет
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как показать пользовательские функции объекта test? Katy93 Общие вопросы Javascript 0 12.12.2021 04:02
Можно ли так использовать callback функции? Denwf Node.JS 2 14.03.2017 10:20
Игра в демки, пиар ангуляра и обучение. DjDiablo Angular.js 39 07.06.2014 13:11
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
тест magistr_bender Оффтопик 44 25.10.2008 19:28