【问题标题】:Why do I need to specify window variable scope in backbone route filter?为什么我需要在骨干路由过滤器中指定窗口变量范围?
【发布时间】:2013-09-20 02:02:56
【问题描述】:

我在我的backbone.js 应用程序中使用主干路由过滤器https://github.com/fantactuka/backbone-route-filter。这是一个单页应用程序,因此我尝试使用 KissMetrics 事件跟踪 sn-p 记录浏览量。代码如下:

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

【问题讨论】:

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


    【解决方案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 = ...,则除了在同一代码块中之外,其他任何地方都无法访问它)。

    【讨论】:

    • 骨干路由器的范围是什么?
    • 明白了,谢谢!我很困惑,因为当我在 view 中包含 _kmq 时,事件顺利通过。那么view的范围是window,router的范围不是?
    • 我需要查看更多代码,但我猜您是在 引用 _kmq 默认为全局范围。当您在方法中设置 var _kmq 时(就像您所做的那样),它仅在本地范围内设置。
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多