Ho sempre immaginato che dichiarando una variabile
var num=1
questa venisse memorizzata nella memoria come una coppia chiave(num) -> valore(1) (quasi come un array).
Tuttavia in praticamente tutti i linguaggi di programmazione con cui ho avuto a che fare, è possibilissimo creare un loop del genere
for (i=0; i<10; i++)
{var num=1}
Quindi creo 10 variabili aventi il nome num.
Si potrebbe immaginare che ad ogni ciclo la variabile del precedente ciclo venga cancellata e riallocata (garbage collected) dato che in questo semplice esempio non ci sono ulteriori referenze alla stessa.
Ma ci sono tuttavia casi più complessi che mi son saltati all'occhio utilizzando l'API di google maps, e nello specifico nell'inizializzazione di molteplici "marker" (che per inciso sarebbero quei puntatori arancioni che indicano un punto preciso della mappa)
Per farla breve questo è il codice
for( i = 0; i < markers.length; i++ )
{
var position = new google.maps.LatLng(markers[i][1], markers[i][2]);
bounds.extend(position);
marker = new google.maps.Marker({
position: position,
map: map,
title: markers[i][0]
});
// Aggiungo una infoWindow per ciascun marker
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infoWindow.setContent(infoWindowContent[i][0]);
infoWindow.open(map, marker);
}
})(marker, i));
}
A differenza che nel primo esempio, questa volta le variabili create nel loop sono referenziate anche nelle fasi successive. Nello specifico il marker è visualizzato a schermo ed è possibile interagirvici (tramite click). Appare quindi chiaro che il marker è un'entità ben definita che deve avere per forza di cose un'allocazione all'interno della memoria.
Ma a questo punto come fa il sistema a distinguere i diversi marker che si sono creati dal momento in cui essi hanno uno stesso nome?
Se al di fuori del loop mi permettessi di scrivere
var num=0;
var num=0;
avrei ovviamente un errore di compilazione, com'è che invece nei loop questo viene bypassato?