0

backbone.js アプリでバックボーン ルート フィルターhttps://github.com/fantactuka/backbone-route-filterを使用しています。これは 1 ページのアプリなので、KissMetrics イベント追跡スニペットを使用してページビューを記録しようとしていました。コードは次のとおりです。

before: {
    '*any': function(fragment, args) {

    }
  },

  after: {
    '*any': function(fragment) {

      var _kmq = window._kmq || [];
      _kmq.push(['record', 'Viewed ' + fragment]);
    }
  },

問題は、_kmq 変数の「ウィンドウ」スコープを指定しない限り、イベントが追跡されないことです。なんで?私のindex.html、またはすべてのjsコードを含む1つのページには、次のものがあります。

var _kmq = _kmq || [];

グローバルレベルで自動的に変数を作成すると思いました...これは典型的な実装へのリンクです: http://support.kissmetrics.com/apis/javascript/index.htmlスコープをウィンドウに設定せずに、一般的なAPIメソッドが機能しました:http://support.kissmetrics.com/apis/javascript/javascript-specific/index.html

「_kmq」だけでなく「window._kmq」を指定する必要があったのはなぜですか?

4

1 に答える 1

1

これは、ローカル スコープとグローバル スコープの問題のようです (この例については、JavaScript における変数のスコープとは?を参照してください)。

ページに Kiss Metrics Javascript を含めているため、グローバル (つまりwindow._kmq) 変数でイベントの更新を探します。window._kmqグローバルにアクセス可能な変数にイベントをプッシュしていることを確認するには、イベントがローカル コンテキスト (つまり )ではなくグローバル コンテキスト (つまり ) に存在することを指定する必要があります_kmq

ページに直接存在する Javascript コードでは、デフォルトのスコープは 内windowにあるためvar _kmq = ...、 と同じwindow._kmq = ...です。

バックボーン ルーターでは、これは当てはまりません。内部のスコープは分離されています (つまりvar _kmq = ...、ルーター内に設定すると、同じコード ブロック以外のどこからでもアクセスできなくなります)。

于 2013-09-20T02:11:06.470 に答える