Working with Graphs & Trees

What is the purpose of maintaining two separate sets (visited and recStack) in this algorithm?
function detectCycle(graph) {
  const visited = new Set();
  const recStack = new Set();
  
  function dfsHasCycle(vertex) {
    visited.add(vertex);
    recStack.add(vertex);
    
    for (let neighbor of graph[vertex]) {
      if (!visited.has(neighbor)) {
        if (dfsHasCycle(neighbor)) return true;
      } else if (recStack.has(neighbor)) {
        return true;
      }
    }
    
    recStack.delete(vertex);
    return false;
  }
  
  return dfsHasCycle(Object.keys(graph)[0]);
}
Next Question (11/21)