$rootScope var which points to the parent of all the scopes and can be injected everywhere. All other scopes are children of the $rootScope. They are created via the $new method of the $rootScope thus every scope inherits from the $rootScope.
In the angular source in the definition of the Scope constructor there is a line :
function Scope() {
this.$id = nextUid();
...
this['this'] = this.$root = this;
...
It seems the $root var is just a placeholder for this of the first scope created – $rootScope.
Next there is this piece of code in the $new method:
$new: function(isolate) {
...
if (isolate) {
child = new Scope();
child.$root = this.$root;
...
return child;
So the $root var of every scope child of $rootScope is a reference to $rootScope. And all the children of those children will get the same reference to $rootScope
In my opinion it is better to use the $rootScope via dependency injection because it is an explicit and overall more frequently used way of referring to the $rootScope