为什么我需要在骨干路由过滤器中指定窗口变量范围?

时间:2013-09-20 02:02:56

标签: javascript backbone.js scope backbone-views backbone-routing

我在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'?

1 个答案:

答案 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 = ...,除了同一个代码块之外的任何地方都无法访问它)。