Lamento responder tardíamente, pero leo la respuesta aceptada y creo que se olvida lo más importante. Así que voy a tratar de explicar lo que he entendido:
En primer lugar, se ha explicado, pero la respuesta tiene que ser completa, de modo que explico también, comienzan con el código:
var _gaq = _gaq || [];
Asegura que _gaq se define. Si no está definido, se inicializa en una matriz vacía.
Piense que como el equivalente:
var _gaq;
/* ... */
if(!_gaq)
_gaq = [];
El valor javascript undefined
es "falsish"/"Falsy", es decir, se evalúa como falsa cuando se convierte a un valor booleano, por lo _gaq se inicializa con []
en este caso .
Lo importante tener en cuenta es que:
- si _gaq contiene una matriz en esta etapa, _gaq es "trueish", por lo que se mantendrá su valor (y no ser vaciado)
- si _gaq contiene otro tipo de objeto en esta etapa, _gaq también puede mantener su valor
Bueno, he explicado, lo mejor que puedo, algo que ya se ha explicado. La mayoría de las personas con experiencia en javascript ya lo habían entendido. Sin embargo, la parte interesante no es solo el comienzo.
_gaq.push(['command', 'argument']); // is very interesting too
Si _gaq es una matriz, todos ustedes supongo que el tema ['command', 'argument']
se añade a la matriz. Google Analytics almacena esto en su cola para su posterior procesamiento. La matriz _gaq se usa como una cola.
Pero la parte realmente interesante es que _gaq.push(/*...*/)
se puede hacer sin tener una matriz llamada _gaq. Es solo una llamada a un método, y las matrices que no son matrices también pueden tener un método "push
".
"Abre nuevas posibilidades". Aquí hay un resumen de uno:
- Mientras el archivo javascript externo no se cargue de forma asíncrona, _gaq es una matriz utilizada como cola.
- Los ga.js externos procesan la cola.
- ga.js luego reemplaza _gaq por un objeto que proporciona un método push.
- Una vez que _gaq es reemplazado por un objeto, los comandos
_gaq.push(/*...*/)
ya no necesitan ser diferidos, se pueden ejecutar.
Para quienes se perdieron la parte de carga de la escritura asíncrona, es:
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
Usando temporalmente una matriz como una cola y el método de empuje está un gran código. Es una forma muy interesante de hacer frente al hecho de que cuando se ejecuta _gaq.push(/*...*/)
, no siempre es así si la dependencia ya se ha cargado de forma asíncrona o no.
Otra forma interesante relacionada con la gestión de este tipo de problemas es la new Google Analytics "isogram" snippet: ga(/*...*/)
se ve aún más intuitivo para las llamadas que _gaq.push(/*...*/)
, pero todavía hace frente a las alegrías relacionados con las dependencias de carga de forma asíncrona.
¿Alguien puede explicar para qué sirve?
Espero que mi respuesta anterior lo haya hecho. Lo que quería compartir aquí es que la primera línea se hace de una manera particular para encajar con todo: inicialización que nunca daña si se hace dos veces, uso inteligente del método push ...
hace Google Analytics en un objeto global llamado _gaq?
Sí lo hace, al utilizar este fragmento de ga.js.
También vale la pena señalar que, a menos que use dos fragmentos en la misma página (y use código incorrecto), existen formas mucho mejores de implementar múltiples rastreadores que simplemente pegar el fragmento dos veces con diferentes ID de cuenta), puede reemplazar esta línea con 'var _gaq = []'. Algunas más posibles microoptimizaciones para el fragmento asíncrono de Google Analytics se pueden encontrar aquí: http://mathiasbynens.be/notes/async-analytics-snippet –