Извините, что отвечаю поздно, но я прочитал принятый ответ и думаю, что он упускает самое главное. Поэтому я попытаюсь объяснить, что я понял:
Во-первых, это было объяснено, но ответ должен быть полным, поэтому я тоже объясняю, код начинается с:
var _gaq = _gaq || [];
Это гарантирует, что _gaq определен. Если он не определен, он инициализируется в пустой массив.
Думайте как эквивалент:
var _gaq;
/* ... */
if(!_gaq)
_gaq = [];
Значение javascript undefined
равно "falsish" / "falsy", то есть при преобразовании в логическое значение оно принимает значение false, поэтому _gaq инициализируется []
в этом случае.
Важно отметить, что:
- если на этом этапе _gaq содержит массив, _gaq имеет значение "trueish", поэтому он сохранит свое значение (и не будет очищен)
- если на этом этапе _gaq содержит другой тип объекта, _gaq также может сохранить его значение
Ну, я как-то объяснил, как я уже объяснил, кое-что уже объяснил. Большинство людей, знакомых с javascript, уже поняли это. Однако интересная часть - это не только начало!
_gaq.push(['command', 'argument']); // is very interesting too
Если _gaq - это массив, вы все догадаетесь, что элемент ['command', 'argument']
добавлен в массив. Google Analytics хранит это в своей очереди для дальнейшей обработки. Массив _gaq используется в качестве очереди.
Но действительно интересной частью является то, что _gaq.push(/*...*/)
может быть сделано без массива с именем _gaq. Это просто вызов метода, и у не массивов также может быть метод "push
".
Это «открывает новые возможности». Вот краткое изложение одного:
- Пока внешний файл javascript не загружен асинхронно, _gaq - это массив, используемый в качестве очереди.
- Затем внешний ga.js обрабатывает очередь.
- ga.js затем заменяет _gaq объектом, который предоставляет метод push.
- Как только _gaq заменяется объектом, команды
_gaq.push(/*...*/)
больше не нужно откладывать, их можно выполнять.
Для тех, кто пропустил часть загрузки асинхронного скрипта, это:
(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(/*...*/)
мы теперь не всегда можем определить, была ли зависимость загружена асинхронно или нет.
Другим интересным способом решения подобных проблем является новый фрагмент изограммы Google Analytics : ga(/*...*/)
выглядит еще более интуитивно понятным для вызовов, чем _gaq.push(/*...*/)
, но он по-прежнему справляется с радостями связанные с загрузкой зависимостей асинхронным способом.
Кто-нибудь может объяснить, для чего это?
Я надеюсь, что мой ответ выше сделал это. Я хотел бы поделиться здесь тем, что первая строка сделана особым образом, чтобы соответствовать целиком: инициализация, которая никогда не наносит вреда, если выполняется дважды, умное использование метода push ...
использует ли Google Analytics глобальный объект с именем _gaq?
Да, при использовании этого фрагмента ga.js.