Je suis un peu en retard ici mais j'ai pensé donner quand même une réponse et élaborer quelque chose.
Il vaut mieux ne pas penser en termes de pointeurs et de références mémoire lorsqu'on discute des détails internes de JavaScript (ou ECMAScript) en traitant avec les spécifications. Les variables sont des enregistrements d'environnement internes et sont stockées et référencées par nom, pas par adresse mémoire. Ce que fait votre instruction d'assignation, internement et par conception, c'est rechercher le nom de l'enregistrement d'environnement (soit "foo" soit "bar") et assigner la valeur à cet enregistrement.
Ainsi,
var bar = function () { alert("A"); }
assigne à l'enregistrement d'environnement "bar" la valeur (fonction anonyme).
var foo = bar;
appelle internement GetValue("bar") qui récupère la valeur associée à l'enregistrement "bar" et associe ensuite cette valeur à l'enregistrement "foo". Ainsi, après cela, la valeur d'origine de bar peut toujours être utilisée car elle est maintenant associée à foo.
Parce que JavaScript fait référence par chaîne et non par adresse mémoire, c'est précisément pourquoi vous pouvez faire des choses comme ceci :
someObject["someProperty"]
qui recherche la valeur en fonction du nom de la propriété.