作为 JavaScript 语言的简化子集,沙盒化 JavaScript 提供了一种安全的方法,可让用户在 Google 跟踪代码管理器的自定义模板中执行任意 JavaScript 逻辑。为了提供安全的执行环境,它限制或移除了 JavaScript 的部分功能。在沙盒中运行的 JavaScript 以 ECMAScript 5.1 为基础,而且可以使用 ECMAScript 6 的部分功能,如箭头函数和 const
/let
声明等。
全局执行环境
在沙盒中运行的 JavaScript 不会像常规 JavaScript 那样在标准的全局执行环境中执行,因此无法使用 window
对象及其属性,包括在全局范围中定义的方法(如 encodeURI
或 setTimeout
)、全局值(如 location
或 document
)以及由加载的脚本定义的全局值。为了弥补这一缺陷,所有在沙盒中运行的 JavaScript 均配有全局 require
函数,可提供上述大部分功能。窗口中的值则可使用 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']);