如何在不同的javascript文件中获取变量的值?

如何在不同的javascript文件中获取变量的值?,javascript,jquery,scope,Javascript,Jquery,Scope,test.html <script src="jsv/test1.js"></script> <script src="jsv3/test2.js"></script> test2.js: (function ($) { var settings = { taphold_threshold: 750, hold_timer: null, tap_timer: null };) }; var Navigatio

test.html

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

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

我想获得设置的值:taphold_threshold,但似乎我无法通过简单地警告它来获得该值。test2.js是调用方,test1.js是被调用方。这应该是一些范围问题。如何获得值(750)?谢谢

问题确实是作用域-
设置
将位于匿名作用域中,在闭包之外不可用

您可以将test1更改为一种“名称空间”——比如说
global
(尽管我个人会使用比global更具描述性的名称)

test2可以使用:

alert(global.settings.taphold_threshold);

由于
var设置
是在闭包内部的test1.js中定义的,因此存在问题

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

window.settings = ...


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

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

您的代码暗示了一个名称空间模式,但稍有不足

你可能会考虑这样的事情

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
具有私有成员
设置
和公共成员
set()
get()
。您将看到,很容易添加更多的私有和公共成员

现在,您有了一种机制,可以从点击范围内的任何位置设置和获取点击设置:

TAP.set({hold_threshold: 500});

var Navigation = {
  init: function () {
    self = this;
    $('#button').live(tapMode, function () {
      alert(settings[TAP.get().hold_threshold]);
    });
  }
}
使用
TAP
作为全局命名空间中的成员,它的公共方法在所有作用域中都可用

更典型的是,您将使用模块模式,该模式只将一个项目成员放入全局名称空间,包含任意数量的模块,每个模块包含任意数量的功能名称空间,例如:

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、它的模块和功能名称空间都是大写的。

只是想知道答案有什么问题,这样我就可以纠正自己+1,因为你没有错,事实上,你是对的,但有一个例外:当使用[]时,你需要引用名称
window['settings']
您的
var global
实际上又是一个局部作用域变量。@metadings-确实如此,但它不包含在闭包中,因此可以从主作用域访问。
TAP.set({hold_threshold: 500});

var Navigation = {
  init: function () {
    self = this;
    $('#button').live(tapMode, function () {
      alert(settings[TAP.get().hold_threshold]);
    });
  }
}
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);