Мне трудно понять, когда присвоение данных объекту является ссылкой и когда создается копия объекта. Я думал, что понял, но следующий пример не соответствует моему простому пониманию этого.
Обработчик событий запускает серию шагов следующим образом.
Promise.allSettled( [ gather_write, get_build ] ).then( test );
Обещания gather_write
и get_build
выполняют несвязанные функции. Первый собирает некоторые данные из DOM и записывает их в базу данных. Второй извлекает данные из базы данных и строит фрагмент документа. Если оба выполняются, то узел в DOM заменяется фрагментом.
Слишком много кода, чтобы показать здесь, но get_build
, после успешного получения данных из базы данных, вызывает отдельную функцию, которая создает фрагмент документа, и возвращал свой результат как свойство объекта разрешения. Это работало нормально; и затем я хотел попытаться предоставить опции пользователю в случае, если gather_write
отклонено и get_build
выполнено, что требует временного хранения фрагмента документа. Таким образом, вместо того, чтобы возвращать его и передавать обратно в Promise.allSettled
, он сохраняется в свойстве функции, которая его создает.
В синхронной функции build
код задается как:
function build()
{
let f;
try
{
f = document.createFragment();
// ...build the fragment...
build.html = f;
}
catch(e)
{ }
finally
{ f = null; }
} // close build
Функция build
должна завершиться до того, как обещание get_build
может быть выполнено, после чего Promise.allSettled
может быть оценено; и, если оба обещания выполняются, может быть вызвана функция замены узла DOM вновь созданным фрагментом, хранящимся в build.html
. Я думал, что build.html
будет ссылкой на объект узла f
и что, поскольку f
установлен в нуль в блоке finally
, это произойдет до того, как все вышеперечисленное может завершиться, и когда код чтобы, наконец, использовать build.html
, он указывал бы на ноль, а не на фрагмент. Таким образом, оператор присваивания должен быть build.html = f.cloneNode(true)
.
Однако этот процесс работает нормально с использованием f.cloneNode
и без него. Не могли бы вы объяснить, почему? Я не хочу, чтобы браузер предпринял шаги для клонирования фрагмента, если он не нужен, но стесняюсь исключить его, не понимая, почему он работает без клонирования.
Спасибо.