在 React 的 completeUnitOfWork 函数中,firstEffect 和 lastEffect 被用来维护一个副作用(side-effect)链表。这个链表记录了所有需要在 commit 阶段执行的副作用操作。在 completeUnitOfWork 函数中,当一个 Fiber 节点完成时,它的副作用会被添加到父节点的副作用链表中。具体来说,如果父节点的 firstEffect 为 null,则直接将当前节点的 firstEffect 赋值给父节点的 firstEffect;如果父节点已经有副作用,则将当前节点的 firstEffect 链接到父节点的 lastEffect 的 nextEffect 上,并更新父节点的 lastEffect 为当前节点的 lastEffect。这样做的目的是为了在 commit 阶段能够方便地遍历这个链表,执行所有需要的副作用操作。
此外,completeUnitOfWork 函数中会完成这一步,把所有的effect节点进行一个串联,让 commitWork 的阶段可以非常方便的根据这个链去执行每一个节点的最终的操作。这个链状结构最终是用于 commitWork 的时候用来进行对这些有 SideEffect的节点进行 commit 的一个操作。