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