Zuerst fällt mir auf, dass Du eine Variableninstanziierung (oder wie auch immer man das nennt) mit dem Schlüsselwort "var" in einer Schleife mehrfach tust. Meines Wissens sollte das spätestens beim zweiten Schleifendurchlauf zu einer Fehlermeldung führen.
Mehrfachdeklaration ist kein Problem. Variablendeklarationen werden durch »Hoisting« ohnehin nur einmal, nämlich beim Springen in den Funktionskontext vor Beginn der Ausführung des Funktionskörpers abgearbeitet.
Wo man die Variable deklariert und wie häufig, ist insofern egal, manche raten dazu, sämtliche Variablen am Funktionsanfang zu deklarieren.
Es ist nun eine Eigenschaft von JavaScript, dass "uri" als Variablenobjekt innerhalb des Funktionsobjekts bekannt ist (daher kann der Wert aus "uri" verwendet werden), sodass auch Änderungen am Wert dieser Variable mit "erinnert" werden. Diesen Zusammenhang nennt man "Closure".
Ein Variablenobjekt ist etwas anderes als eine Variable. Der korrekte Begriff hier ist »Variable«. Siehe auch http://molily.de/javascript-core/
Mathias