我在backbone.js应用中使用骨干路由过滤器https://github.com/fantactuka/backbone-route-filter。这是一个单页应用程序,因此我尝试使用KissMetrics事件跟踪代码段记录综合浏览量。这是代码:
before: {
'*any': function(fragment, args) {
}
},
after: {
'*any': function(fragment) {
var _kmq = window._kmq || [];
_kmq.push(['record', 'Viewed ' + fragment]);
}
},
问题是,除非我指定_kmq变量的'window'范围,否则事件不会跟踪。为什么?在我的index.html或带有我所有js代码的一页中,我有:
var _kmq = _kmq || [];
我认为它会自动使变量处于全局级别......这是典型实现的链接:http://support.kissmetrics.com/apis/javascript/index.html在我所见过的每种情况下,我都看到了常见的api方法工作,而没有设置范围到窗口:http://support.kissmetrics.com/apis/javascript/javascript-specific/index.html
为什么我需要指定'window._kmq'而不只是'_kmq'?
答案 0 :(得分:1)
这看起来像是本地范围与全局范围的问题(有关此示例,请参阅What is the scope of variables in JavaScript?)。
由于您在页面上包含了Kiss Metrics Javascript,因此它将查找全局(即window._kmq
)变量以进行事件更新。为了确保将事件推送到全局可访问变量,您需要指定它位于全局上下文(即window._kmq
)与本地上下文(即_kmq
)之间。
在直接位于页面上的Javascript代码中,默认范围位于window
内,因此var _kmq = ...
与window._kmq = ...
相同。
在你的Backbone路由器中,情况并非如此:内部的范围是隔离的(也就是说,如果你在路由器中设置var _kmq = ...
,除了同一个代码块之外的任何地方都无法访问它)。