Изолированный JavaScript

Изолированный 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']);