沙盒化 JavaScript

作为 JavaScript 语言的简化子集,沙盒化 JavaScript 提供了一种安全的方法,可让用户在 Google 跟踪代码管理器的自定义模板中执行任意 JavaScript 逻辑。为了提供安全的执行环境,它限制或移除了 JavaScript 的部分功能。在沙盒中运行的 JavaScript 以 ECMAScript 5.1 为基础,而且可以使用 ECMAScript 6 的部分功能,如箭头函数和 const/let 声明等。

全局执行环境

在沙盒中运行的 JavaScript 不会像常规 JavaScript 那样在标准的全局执行环境中执行,因此无法使用 window 对象及其属性,包括在全局范围中定义的方法(如 encodeURIsetTimeout)、全局值(如 locationdocument)以及由加载的脚本定义的全局值。为了弥补这一缺陷,所有在沙盒中运行的 JavaScript 均配有全局 require 函数,可提供上述大部分功能。窗口中的值则可使用 copyFromWindow 实用程序进行读取。

简化类型系统

在沙盒中运行的 JavaScript 支持以下类型:nullundefinedstringnumberbooleanarrayobjectfunction。数组和对象均使用字面量语法 ([] {}) 进行创建,但因为无法访问标准全局执行环境,所以无法使用全局构造函数,如 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']);