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