2

test.html

 <script src="jsv/test1.js"></script>
 <script src="jsv3/test2.js"></script>

test1.js:

(function ($) {
  var settings = {
    taphold_threshold: 750,
    hold_timer: null,
    tap_timer: null
  };)
};

test2.js:

var Navigation = {
  init: function () {
    self = this;
    $('#button').live(tapMode, function () {
      alert(settings[taphold_threshold]);
    });
  }
}

settings : taphold_threshold の値を取得したいのですが、単純に警告するだけでは値を取得できないようです。test2.js が呼び出し元で、test1.js が呼び出し先です。それは何らかのスコープの問題であるはずです。値を取得する方法 (750) ? ありがとう

4

4 に答える 4

4

問題は確かにスコープです-settingsクロージャーの外では利用できない匿名のスコープになります。

test1を一種の「名前空間」を持つように変更できます-次のように言いますglobal(ただし、個人的にはグローバルよりもわかりやすい名前を使用します)。

var global = {};
global.settings = {
    taphold_threshold: 750,
    hold_timer: null,
    tap_timer: null
  };

あなたが使用できるからのtest2

alert(global.settings.taphold_threshold);
于 2013-01-07T08:45:59.060 に答える
2

コードは名前空間パターンを示唆していますが、わずかに不足しています。

あなたはこのようなことを検討したいかもしれません

var TAP = (function($) {//functional namespace
  var settings = {
    hold_threshold: 750,
    hold_timer: null,
    timer: null
  };
  var setSettings = function(s) {
    settings = $.extend(settings, s);
  };
  var getSettings = function() {
    return settings;
  };
  return {
    set: setSettings,
    get: getSettings
  };
})(jQuery);

したがって、TAPプライベートメンバーsettingsとパブリックメンバーがset()ありget()ます。プライベートメンバーとパブリックメンバーを簡単に追加できることがわかります。

これで、TAPがスコープ内にある場所からTAP設定を設定および取得するメカニズムができました。

TAP.set({hold_threshold: 500});

var Navigation = {
  init: function () {
    self = this;
    $('#button').live(tapMode, function () {
      alert(settings[TAP.get().hold_threshold]);
    });
  }
}

グローバル名前空間のメンバーとして、そのTAPパブリックメソッドはすべてのスコープで使用できます。

より一般的には、MODULEパターンを使用します。これは、1つのPROJECTメンバーのみをグローバル名前空間に配置します。これには、任意の数のMODULESが含まれ、それぞれに任意の数の機能的なNAMESPACEが含まれます。

var MYPROJECT = {};//global
MYPROJECT.MODULE1 = {};
MYPROJECT.MODULE1.TAP= (function($) {
  var settings = {
    hold_threshold: 750,
    hold_timer: null,
    timer: null
  };
  var setSettings = function(s) {
    settings = $.extend(settings, s);
  };
  var getSettings = function() {
    return settings;
  };
  return {
    set: setSettings,
    get: getSettings
  };
})(jQuery);

慣例により、MYPROJECT、そのモジュール、およびその機能的な名前空間は大文字で表記されます。

于 2013-01-07T09:11:46.030 に答える
1

クロージャ内のtest1.jsvar settings定義されているため、問題が存在します。

設定変数を次のように定義することをお勧めします

window.settings = ...

また

window['settings'] = ...

したがって、今settingsはグローバル変数として定義されます。

于 2013-01-07T08:48:40.370 に答える
1

settingsクロージャー内にネストされており、外部からアクセスすることはできません。1 つの解決策は、クロージャを削除してグローバル オブジェクトにすることです。もう1つの解決策は、変数をグローバルにするのと同じようにウィンドウオブジェクトに割り当てることですが、これはクロージャ内から機能します。次に例を示します。

(function ($) {
    window.my_namespace = window.my_namespace || {};
    window.my_namespace.settings = {
        taphold_threshold: 750,
        hold_timer: null,
        tap_timer: null
    };
});

var Navigation = {
    init: function () {
        self = this;
        $('#button').live(tapMode, function () {
            alert(my_namespace.settings[taphold_threshold]);
        });
    }
};
于 2013-01-07T08:56:25.730 に答える