1 - No llamo a la función alerta. Simplemente refiero a la variable alerta. Pero si te fijás bien, a esa variable
le había asignado el valor de retorno de la función anónima externa (notá los paréntsis al final de la asignación). Y esa
función, cuando es ejecutada, retorna la función interna. Con lo cual, invocar la variable alerta es en realidad invocar
la función interna, que sí requiere argumentos. Si no hubiera colocado los paréntesis al final de la asignación
del valor de la variable alerta, en cambio, las llamadas tendrían que usar un doble juego de paréntesis:
Código PHP:
alerta=function(){
var contador=0;
return function(m){
alert('mensaje '+(++contador)+':'+m);
}
};//aquí saco los paréntesis, entonces ya no llamo de manera directa a la función interna usando la variable alerta
alerta()('algo');
alerta()('algo');
alerta()('algo');
alerta()('algo');
2-Cuando digo su propio contexto me refiero a que el ámbito global de la función interna, además de window, es la función externa que la envuelve.
Y lo es de la misma manera que, en el ejemplo de contador2 (el primero), el ámbito global de la función contador2 es window,
ya que la variable n en ese primer ejemplo (que en realidad es window.n o window['n'], y eso explica el porqué de window...)
tiene significado dentro de la
función contador2 tal como la variable contador, que es local a la función externa del segundo ejemplo, tiene significado (alcance)
global dentro de la función
anónima interna.
El paralelismo que trataba de trazar es: la función externa es a la función interna lo que window es a la función contador2
3-Bueno, una vez que entendemos que cualquier variable global equivale a window.variable, ya que todas las variables globales
"cuelgan" del objeto window, creo que sobran las explicaciones.