Есть несколько способов сделать то, что вы просите, но большинство из них требуют изменения сигнатуры функций.
Один из способов сделать это - создать функцию получения для этого объекта, ипередать эту функцию вместо самого объекта.
var a = 5;
function getA() {
return a;
}
function test(getObj) {
console.log(getObj());
setTimeout(function() {
console.log(getObj());
}, 250);
}
test(getA);
a = 2;
Другим способом было бы обернуть объект другим объектом, заставить все функции сохранять ссылку на родительский объект, и при каждом изменении ссылки не будет никакихдругие ссылки на этот объект остались.
var wrapper = {
a: 5
};
function test(wrap) {
console.log(wrap.a);
setTimeout(function() {
console.log(wrap.a);
}, 250);
}
test(wrapper);
wrapper.a = 2;
Наконец, если вам не нужна ссылка на исходный объект, вы можете просто заменить все поля вместо создания нового объекта (при условии, что нет закрытыхполя).