2

测试.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]);
    });
  }
}

我想获得设置的值: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 模式,它只将一个PROJECT 成员放入全局命名空间,包含任意数量的 MODULE,每个 MODULE 包含任意数量的功能性命名空间,例如:

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、它的 MODULES 和它的功能性命名空间都是大写的。

于 2013-01-07T09:11:46.030 回答
1

由于在闭包内的test1.jsvar settings中定义,因此存在问题。

您可能希望将设置变量定义为

window.settings = ...

或者

window['settings'] = ...

所以现在settings将被定义为一个全局变量。

于 2013-01-07T08:48:40.370 回答
1

settings嵌套在闭包中,无法从外部访问。一种解决方案是删除闭包,使其成为全局对象。另一种解决方案是将其分配给窗口对象,与使变量全局变量相同,但这在闭包内部起作用。这是一个例子:

(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 回答