A very reasonable question! The key here is the pipe operator %>%. The pipe passes the result of the last step into the first argument of the next step. So these two expressions do the same thing:
replace_na(df, list(x = 0, y = "unknown"))
df %>% replace_na(list(x = 0, y = "unknown"))
The tidyverse is committed to the pipe as a way of making code more readable by humans, so functions that operate on data frames try to be "pipe-friendly" by always having a first argument that can receive a data frame. That way you can chain a bunch of operations together so that you have this:
df %>%
replace_na(list(x = 0, y = "unknown")) %>%
group_by(y) %>%
summarize(mean_x = mean(x))
instead of this:
summarize(group_by(replace_na(df, list(x = 0, y = "unknown"), y), mean_x = mean(x))
You can read lots more about this in the Pipes chapter of R for Data Science.