Template tag functions rely on global variables to access post being processed and retrieve data from it or related to it.
Main variable of them is
$post which holds post object itself. In your example it's not explicit, but what is happening is that your loop assigns data to
$post, if name for iteration wasn't
$post you would need to do that explicitly (
global $post; $post = $some_other_post;).
However there is bunch of other globals and purpose of
setup_postdata() is to fill them in with data. If you look at source namely they are:
global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages;
Note that in most cases you should be calling
wp_reset_postdata() afterwards to return globals to their original state.