0

我在我的主干网应用程序中使用主干路由过滤器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 变量的“窗口”范围,否则不会跟踪事件。为什么?在我的 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'?

4

1 回答 1

1

这看起来像是一个局部与全局作用域的问题(有关这方面的一些示例,请参阅What is the scope of variables in JavaScript? )。

由于您在页面上包含 Kiss Metrics Javascript,它将在全局(即window._kmq)变量中查找事件更新。为了确保您将事件推送到该全局可访问变量中,您需要指定它存在于全局上下文(即,window._kmq)而不是本地上下文(即,_kmq)中。

在直接存在于页面上的 Javascript 代码中,默认范围为 inside window,因此var _kmq = ...window._kmq = ....

在您的 Backbone 路由器中,情况并非如此:内部的范围是隔离的(也就是说,如果您var _kmq = ...在路由器内部设置,则除了在同一代码块中之外,其他任何地方都无法访问它)。

于 2013-09-20T02:11:06.470 回答