如何在不同的javascript文件中获取变量的值?
test.html如何在不同的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
<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);