Замена редактора предыдущих геообъектов массива, при добавлении нового геообъекта в массив

По кнопке добавляется круг на карту, если добавить подряд несколько, то редактор каждого будет ссылаться только на последний. Не понимаю почему так, если отдельно создать второй объект, его редактор будет независим.

new_circles.push(0);
new_circles[new_circles.length-1] = new ymaps.Circle([map.getCenter(), 100000], {}, {
    fillColor: 'ff0000', fillOpacity: 0.2,
    editorMenuManager: function (items) {
        items.splice(0, 1);
        items.push({
            title: "Завершить " + new_circles.length,
            onClick: function () {
                new_circles[new_circles.length-1].editor.stopEditing();
            }
        });
        items.push({
            title: "Удалить круг",
            onClick: function () {
                map.geoObjects.remove(new_circles[new_circles.length-1]);
            }
        });
        return items;
    }
});
map.geoObjects.add(new_circles[new_circles.length-1]);
new_circles[new_circles.length-1].editor.startEditing();

Ответы (1 шт):

Автор решения: Виктор Карев

Окружение функции создаётся в момент создания функции. Поэтому нужно вычислить номер, а затем его может использовать созданная функция.

function () {
  ...
  new_circles.push(0);
  const number = new_circles.length-1; // создаём константу, которой воспользуются функции, создаваемые далее
  new_circles[number] = new ymaps.Circle([map.getCenter(), 100000], {}, {
    fillColor: 'ff0000', fillOpacity: 0.2,
    editorMenuManager: function (items) {
        items.splice(0, 1);
        items.push({
            title: "Завершить " + new_circles.length,
            onClick: function () { // создаём функцию, которая может воспользоваться константой number
                new_circles[number].editor.stopEditing();
            }
        });
        items.push({
            title: "Удалить круг",
            onClick: function () { // создаём функцию, которая может воспользоваться константой number
                map.geoObjects.remove(new_circles[number]);
            }
        });
        return items;
    }
  });
  map.geoObjects.add(new_circles[number]);
  new_circles[number].editor.startEditing();
  ...
}
→ Ссылка