Подтвердить что ты не робот

Что такое "var _gaq = _gaq || [];" для?

Код отслеживания Async в Google Analytics выглядит следующим образом:

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

О первой строке:

var _gaq = _gaq || []; 

Я думаю, что это гарантирует, что если _gaq уже определен, мы должны использовать его, иначе нам нужен массив.

Может кто-нибудь объяснить, для чего это?

Кроме того, имеет значение, если _gaq переименовывается? Другими словами, Google Analytics полагается на глобальный объект с именем _gaq?

4b9b3361

Ответ 1

Да, это гарантирует, что _gaq определен, так что _gaq.push() никогда не сработает.

Я бы не стал связываться с именем переменных в коде GA... есть ли у вас какие-либо причины? Это противоречит любой из ваших переменных? (Тогда я бы изменил мою...)

Ответ 2

Эта строка позволяет разрешить несколько фрагментов GA на одной странице. Это гарантирует, что второй фрагмент не перезаписывает _gaq, определяемый первым.

Асинхронное отслеживание GA работает, сначала определяя _gaq как массив. Этот массив действует как очередь, что позволяет вам нажимать (добавлять) конфигурацию и отслеживать "команды" (например, _trackPageview) в конец очереди. Ваши команды хранятся в этом массиве до полной загрузки ga.js.

Когда ga.js готов, он выполняет все команды в массиве _gaq и заменяет _gaq на объект. Этот объект также имеет метод push, но вместо команд очередей он выполняет их немедленно, потому что ga.js доступен для их обработки.

Этот механизм позволяет вам создавать команды конфигурации и отслеживания, не зная, завершил ли браузер загрузку ga.js. Это необходимо, так как асинхронный фрагмент загружает ga.js, не блокируя запуск другого кода на странице. Вещи будут волосатыми, если этот другой код (ваши команды конфигурации) должен был узнать о состоянии загружаемого ga.js.

Все это абсолютно зависит от использования имени _gaq. Вы не должны пытаться назвать его, если хотите, чтобы асинхронное отслеживание работало.

Ответ 3

Использование || в назначении - это общий программный трюк, который использует преимущество направления оценки, которое слева направо. Это означает, что он сначала оценивает левую сторону. Затем и , только если это false (или ложный эквивалент), оценивает ли он правильную сторону.

Вы также можете использовать операторы || или && в простой инструкции if, чтобы

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

if (!some_boolean) {
  do_b();
}

стать

a > 5 && do_a();
some_boolean || do_b(); // Note that the negation operator `!` is gone!

которые лучше подходят для просмотра.

Языки понятий позволяют это, потому что это пустая трата времени, оценивающая правую сторону, если левая сторона все равно приведет к сбою всей линии. Поэтому он просто игнорирует его, если это не нужно.

Ответ 4

EDIT:

i добавит больше деталей

_gaq - это просто массив javascript, как было определено выше. вы добавляете к нему события, такие как обратные вызовы отслеживания событий

когда загружается ga.js script, google принимает этот массив и превращает его в объект, который использует ga.

Вот почему вы вставляете функции в массив _gaq, а затем вызываете ga.js script после того, как вы закончите создание массива.

gaq - очередь Google Analytics. это стека для методов GA, таких как отслеживание событий, атрибуция страницы и т.д. вы используете метод push() для добавления материала GA. уменьшает вмешательство в события, каждый должен это делать или, по крайней мере, изучать концепцию.

Ответ 5

Прошу прощения за ответ, но я прочитал принятый ответ, и я думаю, что он пропускает самое важное. Поэтому я попытаюсь объяснить, что я понял:

Во-первых, это объяснено, но ответ должен быть полным, поэтому я тоже объясню, код начинается с:

var _gaq = _gaq || [];

Это гарантирует, что _gaq определен. Если он не определен, он инициализируется пустым массивом.

Подумайте, как эквивалент:

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

Значение javascript undefined является "фальшивым" / "ложным", то есть оно вычисляется как false при преобразовании в логическое значение, поэтому _gaq инициализируется с помощью [] в этом случае.

Важно отметить, что:

  • Если _gaq содержит массив на этом этапе, _gaq является "истинным", поэтому он будет поддерживать его значение (и не опустеет).
  • Если _gaq содержит другой тип объекта на этом этапе, _gaq также может сохранять свое значение

Хорошо, я снова объяснил, как я могу, что-то уже объясняло. Большинство людей, знакомых с javascript, уже поняли это. Однако интересная часть - это не только начало!

_gaq.push(['command', 'argument']); // is very interesting too

Если _gaq - массив, вы все догадаетесь, что элемент ['command', 'argument'] добавляется к массиву. Аналитика Google хранит это в очереди для дальнейшей обработки. Массив _gaq используется как очередь.

Но действительно интересная часть состоит в том, что _gaq.push(/*...*/) можно сделать без массива с именем _gaq. Это всего лишь вызов метода, а не массивы также могут иметь метод "push".

Это "открывает новые возможности". Вот краткое изложение:

  • Пока внешний файл javascript не загружается асинхронно, _gaq - это массив, используемый в качестве очереди.
  • Внешний ga.js обрабатывает очередь.
  • ga.js затем заменяет _gaq объектом, который предоставляет метод push.
  • Когда _gaq заменяется объектом, команды _gaq.push(/*...*/) больше не нужно откладывать, они могут быть выполнены.

Для тех, кто пропустил асинхронную загрузочную часть script, это:

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

Использование временного массива как очереди, а метод push - отличный код. Это очень интересный способ справиться с тем, что, когда _gaq.push(/*...*/) выполняется, мы не всегда имеем теперь, если зависимость была асинхронно загружена или нет.

Другим интересным способом управления такими проблемами является новый фрагмент "isogram" в Google Analytics: ga(/*...*/) выглядит еще более интуитивно понятным для вызовов, которые _gaq.push(/*...*/), но он по-прежнему справляется с радостями, связанными с загрузкой зависимостей асинхронным способом.

Может кто-нибудь объяснить, для чего это?

Я надеюсь, что мой ответ выше сделал это. Я хотел бы поделиться с вами тем, что первая строка выполняется определенным образом, чтобы соответствовать всему: инициализация, которая никогда не наносит вреда, если это делается дважды, умное использование метода push...

Google Analytics полагается на глобальный объект с именем _gaq?

Да, это так, при использовании этого фрагмента ga.js.

Ответ 6

Да, он делает именно то, что вы думаете, что он делает:) Это сокращение для

if(!_gaq){ var _gaq = [] }

Ответ 7

Это означает, что если _gaq уже определен, он использует это, иначе объявляет пустой массив. С нажатием вы можете переопределить настройки. Если объект _gaq не был определен, 2 "строки" после этого приведут к ошибке.

Да, объект _gaq ожидается в script, который вы укажете в коде там (ga.js).