为什么 window 中暴露的 JS SDK 控制一个 arguments 数组?
Why do JS SDKs exposed in window control an arguments array?
我正在构建一个要在 window
中公开的 JS SDK,然后我去研究其他 SDK 是如何做到的。
对讲机这样做:
var i = function() {
i.c(arguments);
};
i.q = [];
i.c = function(args) {
i.q.push(args);
};
Hotjar 这样做:
h.hj =
h.hj ||
function() {
(h.hj.q = h.hj.q || []).push(arguments);
};
Pendo 这样做:
o._q = o._q || [];
v = ['initialize', 'identify', 'updateOptions', 'pageLoad', 'track'];
for (w = 0, x = v.length; w < x; ++w)
(function(m) {
o[m] =
o[m] ||
function() {
o._q[m === v[0] ? 'unshift' : 'push'](
[m].concat([].slice.call(arguments, 0))
);
};
})(v[w]);
但我真的不明白这段代码的目的是什么,从我收集到的少量信息来看,这似乎与他们在全局 属性 中公开的方法有关。这是我应该做的事情吗在构建 Web SDK 时担心它应该在我的复制粘贴代码段中吗?
好吧,我自己通过阅读缩小的代码弄明白了。
这些东西的存在是为了让这些方法从 JavaScript 被浏览器解释的那一刻起就完全可用,并且由于通过网络加载实际的 JS 资产需要一些时间,你可以可能会错过您的第一个方法调用。
它似乎是一个队列,仅在 SDK 首次加载时使用,处理加载时发生的方法调用。
我正在构建一个要在 window
中公开的 JS SDK,然后我去研究其他 SDK 是如何做到的。
对讲机这样做:
var i = function() {
i.c(arguments);
};
i.q = [];
i.c = function(args) {
i.q.push(args);
};
Hotjar 这样做:
h.hj =
h.hj ||
function() {
(h.hj.q = h.hj.q || []).push(arguments);
};
Pendo 这样做:
o._q = o._q || [];
v = ['initialize', 'identify', 'updateOptions', 'pageLoad', 'track'];
for (w = 0, x = v.length; w < x; ++w)
(function(m) {
o[m] =
o[m] ||
function() {
o._q[m === v[0] ? 'unshift' : 'push'](
[m].concat([].slice.call(arguments, 0))
);
};
})(v[w]);
但我真的不明白这段代码的目的是什么,从我收集到的少量信息来看,这似乎与他们在全局 属性 中公开的方法有关。这是我应该做的事情吗在构建 Web SDK 时担心它应该在我的复制粘贴代码段中吗?
好吧,我自己通过阅读缩小的代码弄明白了。
这些东西的存在是为了让这些方法从 JavaScript 被浏览器解释的那一刻起就完全可用,并且由于通过网络加载实际的 JS 资产需要一些时间,你可以可能会错过您的第一个方法调用。
它似乎是一个队列,仅在 SDK 首次加载时使用,处理加载时发生的方法调用。