Para que é " var gaq = gaq | | [];"?

o código de rastreamento Async no Google Analytics parece-se com isto:

var _gaq = _gaq || []; 
_gaq.push(['_setAccount', 'UA-XXXXX-X']); 
_gaq.push(['_trackPageview']); 

(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); 
})(); 

Sobre a primeira linha:

var _gaq = _gaq || []; 

acho que garante que, se _gaq já está definido, devemos usá-lo caso contrário, devemos usar um array.

Alguém pode explicar para que é isto?

também, importa se _gaq for renomeado? Em outras palavras, o Google Analytics depende de um objeto global chamado _gaq?

Author: mauris, 2010-03-29

7 answers

Sim, garante que _gaq é definido, para que _gaq.push() nunca falhe. Eu não mexeria com o nome das variáveis no código do GA... tens alguma razão para isso? Entra em conflito com alguma das tuas variáveis? (Então eu mudaria a minha...)
 15
Author: Victor, 2010-03-29 13:44:11

Esta linha existe para permitir vários excertos GA na mesma página. Garante que o segundo trecho não sobrepõe um _gaq definido pelo primeiro.

O rastreamento assíncrono funciona definindo primeiro o _gaq como um array. Esta lista funciona como uma fila, que lhe permite carregar (anexar) a configuração e seguir os "comandos" (como _trackPageview) para o fim da fila. Seus comandos são armazenados neste array até ga.o js descarrega tudo.

Quando o ga.o js está pronto. executa todos os comandos na lista _gaq e substitui o _gaq por um objecto. Este objeto também tem um método de push, mas em vez de fazer fila de comandos, executa-os imediatamente, porque ga.js está disponível para processá-los.

Este mecanismo permite-lhe criar comandos de configuração e seguimento sem saber se o navegador terminou de transferir o ga.js. Isto é necessário porque o async snippet downloads ga.js sem bloquear outro código na página de correr. As coisas iriam ficar cabeludo se esse outro código (os seus comandos de configuração) necessitasse de saber o estado de ga.js a ser baixado.

Tudo isto depende absolutamente do uso do nome _gaq. Não devias tentar dar-lhe um nome se queres que o rastreamento assíncrono funcione.

 24
Author: Brian, 2010-03-30 04:46:15

Usar || Em atribuição é um truque de programação comum que tira vantagem da direção de avaliação do operador, que é da esquerda para a direita. Isso significa que avalia o lado esquerdo primeiro. Então, e somente se isso for Falso (ou um falso equivalente), ele avalia o lado direito.

Você também pode tirar proveito dos operadores || ou && numa simples declaração if, de modo que

if (a > 5) {
  do_a();
}

if (!some_boolean) {
  do_b();
}

Torna-se

a > 5 && do_a();
some_boolean || do_b(); // Note that the negation operator `!` is gone!
Que são muito mais bonitas de se ver em.

A razão pela qual as línguas permitem isso, é porque é uma perda de tempo avaliando o lado direito se o lado esquerdo vai fazer toda a linha falhar de qualquer maneira. Por isso ignora-a a não ser que seja necessária.

 13
Author: Tor Valamo, 2010-04-04 19:51:39

Editar:

Vou adicionar mais detalhes

_gaq é simplesmente um array de javascript, como definido pela primeira vez. você adiciona eventos a ele, como rastreamento de eventos callbacks

Quando o ga.o script js é carregado, no entanto, o google pega esse array e o transforma em um objeto, que o ga USA.

É por isso que introduz funções na matriz _gaq e depois liga para a ga.o programa js depois de si;terminou de novo a construção da lista.

O Gaq é a fila do Google analytics. é uma pilha para métodos GA, como rastreamento de eventos, atribuição de páginas, etc. você usa o método push() para colocar coisas GA lá. reduz a interferência do evento, todos devem fazer isso, ou pelo menos aprender o conceito.

 3
Author: duggi, 2010-11-24 18:24:04
Desculpa responder tarde, mas li a resposta aceite e acho que falta a coisa mais importante. Então vou tentar explicar o que entendi:

Primeiro, já foi explicado, mas a resposta tem de ser completa, por isso eu explico também, o código começa por:

var _gaq = _gaq || [];

Garante que o _gaq está definido. Se não estiver definido, é inicializado para um array vazio.

Pensa como o equivalente:

var _gaq;
/* ... */
if(!_gaq)
  _gaq = [];

O valor de javascript undefined é "falsish" / "falsy", ou seja, ele avalia como falso quando convertido para um booleano, então _gaq é inicializado com [] neste caso.

O que importa é que:

  • se _gaq contém um array nesta fase, _gaq é "verdadeiro", por isso vai manter o seu valor (e não ser esvaziado)
  • se _gaq contém outro tipo de objecto nesta fase, _gaq também pode manter o seu valor
Bem, eu re-expliquei, tão bem quanto posso, algo já explicado. A maioria das pessoas experiente com javascript já o tinha compreendido. No entanto, a parte interessante não é apenas o começo!
_gaq.push(['command', 'argument']); // is very interesting too

Se o _gaq for um array, todos vocês irão adivinhar que o item ['command', 'argument'] é adicionado ao array. O Google analytics armazena isso em sua fila para posterior processamento. O array _gaq é usado como uma fila.

Mas a parte realmente interessante é que _gaq.push(/*...*/) pode ser feito sem ter um array chamado _gaq. É apenas uma chamada de método, e não arrays também pode ter um " push" metodo.

"Abre novas possibilidades". Aqui está um resumo de um:
  • desde que o ficheiro javascript externo não seja carregado assíncronamente, _gaq é um array usado como uma fila.
  • the external ga.js então processa a fila.
  • ga.js então substitui _gaq por um objeto que fornece um método de push.
  • uma vez que o _gaq é substituído por um objecto, os comandos {[[7]} não precisam mais de ser adiados, podem ser executados.

Para aqueles que falhou a parte de carregamento de script assíncrono, é:

(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); 
})();

Usar temporariamente um array como uma fila e o método de push é um óptimo código. É uma maneira muito interessante de lidar com o fato de que quando _gaq.push(/*...*/) é executado, nós nem sempre agora se a dependência foi assíncronamente carregada ainda ou não.

Outra forma interessante relacionada de gerir este tipo de problemas é o novo trecho do Google Analytics "isogram": ga(/*...*/) parece ainda mais intuitivo para chamadas que _gaq.push(/*...*/), mas continua a lidar com as alegrias relacionadas com o carregamento de dependências de uma forma assíncrona.
Alguém pode explicar para que é isto?
([14]) espero que a minha resposta acima o tenha feito. O que eu queria compartilhar aqui é que a primeira linha é feita de uma forma particular para se encaixar com a coisa toda: inicialização que nunca prejudica se feita duas vezes, uso inteligente do método push...

O Google Analytics depende de um objecto global chamado _gaq?

Sim. faz, quando usa este ga.excerto de js.
 3
Author: dotpush, 2017-05-23 10:29:57
Sim, faz exactamente o que pensa que faz. É uma abreviatura para
if(!_gaq){ var _gaq = [] }
 2
Author: pawel, 2010-03-29 13:48:26

Isto significa que se o _gaq já estiver definido, use o que for, declara um array vazio. Com o push você pode anular as configurações. Se o objeto _gaq não foi definido as 2 "linhas" depois disso resultaria em um erro.

SIM o objecto _gaq é esperado no script que você inclui no código ali (ga.js).

 0
Author: Fabian, 2010-03-29 13:47:23