Изолированный JavaScript – это упрощенное подмножество языка JavaScript, которое обеспечивает безопасное выполнение пользовательских шаблонов Google Менеджера тегов за счет ограничения или отключения некоторых функций. Изолированный JavaScript основан на языке ECMAScript версии 5.1. В нем доступны некоторые возможности ECMAScript версии 6, такие как стрелочные функции и объявление переменных const
/let
.
Глобальная среда выполнения
В отличие от обычной версии JavaScript, изолированная версия выполняется в нестандартной глобальной среде, которая не поддерживает объект window
и его свойства. К этим свойствам относятся методы глобального уровня (например, encodeURI
и setTimeout
), такие глобальные значения, как location
и document
, а также глобальные значения, которые определяются загружаемыми скриптами. Вместо них в изолированном JavaScript используется глобальная функция require
, которая открывает доступ ко многим возможностям перечисленных выше свойств. Значения могут считываться из объекта window с помощью утилиты copyFromWindow
.
Упрощенная система типов данных
В изолированном JavaScript поддерживаются следующие типы данных: null
, undefined
,string
, number
, boolean
, array
, object
и function
. Для создания массивов и объектов используется литеральный синтаксис ([] {}
). Глобальных конструкторов, таких как String()
и Number()
, нет из-за отсутствия доступа к глобальной среде. В изолированном JavaScript не используется ключевое слово new
, и у функций нет доступа к ключевому слову this
.
Также отсутствуют некоторые нативные методы. Полный список поддерживаемых нативных методов можно найти в стандартной библиотеке.
Формат пользовательского шаблона
Код для реализации пользовательского шаблона представляет собой тело функции, которая выполняется при каждой активации тега или определении переменной. В функции используется один параметр data
для всех значений, заданных в интерфейсе для этого тега или экземпляра переменной, с ключами, которым назначены имена параметров пользовательского шаблона.
Пример реализации тега отслеживания
const sendPixel = require('sendPixel');
const encodeUri = require('encodeUri');
const encodeUriComponent = require('encodeUriComponent');
let url = encodeUri(data['url']);
if (data['useCacheBuster']) {
const encode = require('encodeUriComponent');
const cacheBusterQueryParam = data['cacheBusterQueryParam'] || 'gtmcb';
const last = url.charAt(url.length - 1);
let delimiter = '&';
if (url.indexOf('?') < 0) {
delimiter = '?';
} else if (last == '?' || last == '&') {
delimiter = '';
}
url += delimiter +
encodeUriComponent(cacheBusterQueryParam) + '=' + encodeUriComponent(data['randomNumber']);
}
sendPixel(url, data['gtmOnSuccess'], data['gtmOnFailure']);