Сохранение состояния объекта при передаче в очередь функций (Javascript)

#javascript #arrays #function #object #preserve

#javascript #массивы #функция #объект #сохранение

Вопрос:

Пытался найти способ сохранить состояние моего объекта при вводе функции. Пример кода ниже:

 window.queue = window.queue || [];

var some_data = {
    "object_number":1
}

queue.push(function(){console.log("1:",some_data)});

var some_data = {
    "object_number":2
}

queue.push(function(){console.log("2:",some_data)});

// Code I Cannot Change
for (var i = 0; i < queue.length; i  ) {
    queue[i]();
}
  

Результатом выполнения очереди является:

 1: {object_number: 2}
2: {object_number: 2}
  

Можете ли вы видеть, как при анализе очереди (я не могу изменить этот код — он контролируется кем-то другим) он ищет последнюю версию ‘some_data’?

Есть идеи, как сохранить состояние объекта, когда он был передан? Желаемый результат:

 1: {object_number: 1}
2: {object_number: 2}
  

Спасибо!

Ответ №1:

Вы можете использовать следующий вариант, который будет создавать замыкание с помощью локальной переменной ( value ) каждый раз:

 var some_data = {
    "object_number":1
}

queue.push(((value) => () => console.log("1:",value))(some_data));

var some_data = {
    "object_number":2
}

queue.push(((value) => () => console.log("2:",value))(some_data));
  

В этом случае после перезаписи some_data value не изменяется, поскольку это отдельная переменная. Но обратите внимание, что изменение содержимого some_data также изменит содержимое value (тогда, возможно, вам потребуется копирование some_data перед каждым push ):

 var some_data = {
    "object_number":1
}

queue.push(((value) => () => console.log("1:",value))(some_data));

var some_data = {
    "object_number":2
}

queue.push(((value) => () => console.log("2:",value))(some_data));

some_data.object_number = 1;

for (var i = 0; i < queue.length; i  ) {
    queue[i]();
}

// 1: { object_number: 1 }
// 2: { object_number: 1 }
  

Комментарии:

1. Большое спасибо @z1ne2wo! Я соответствующим образом обновлю и отвечу с результатами

2. Обратите внимание на @z1new2wo — я также публикую нотацию ES6 против ES5 для других пользователей. ES6 . queue.push(((value) => () => console.log("1:",value))(some_data)); . ES5 . queue.push(function (value) { return function () { return console.log("1:", value); }; }(some_data));