我被告知不要使用全局变量。
我用一个来关闭/开启客户端验证。
我再使用两个来控制下拉菜单。
如果这些不应该是全球变量,我应该把它们放在哪里?
/ * 全球 * /
var client_validation=1, // used to turn off/on client-side validation
menu_timer=0,
menu_elment=0;
window.onload=i0;
/*menu*/
function top_mouse_over(id)
{
bottom_mouse_over();
if(menu_element)menu_element.style.visibility='hidden';
menu_element=document.getElementById(id);
menu_element.style.visibility='visible';
}
function internal_time()
{
if(menu_element)menu_element.style.visibility='hidden';
}
function mouse_out()
{
menu_timer=window.setTimeout(internal_time, 500);
}
function bottom_mouse_over()
{
if(menu_timer)
{
window.clearTimeout(menu_timer);
menu_timer=0;
}
}
Header 1 // This makes more sense
Content
Header 1 // Than this
Content
答案 0 :(得分:2)
听起来像你这些可能是全局的好候选人。全局应该被保留用于对应用程序具有广泛影响的操作,例如控制多个部分的基本行为。
现在,如果你想为它们创建一个“命名空间”,就这么简单:
var globalControls = {
client_validation:1,
menu_timer:0,
menu_elment:0,
window_onload:i0
};
Javascript还没有真正的命名空间。在下一版本的ECMAScript可能会添加该功能之前,对象将被用作替代它们。
答案 1 :(得分:1)
这是一篇关于javascript命名空间的文章。
http://javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/
答案 2 :(得分:0)
标题应为“我如何避免全局变量”?但那没关系。
您可以创建一个对象并为其指定属性。然后你将在一个对象中有变量,这些变量只能通过这个变量访问,而不是通过全局范围。
示例:
var config = {
clientValidation: true,
menuTimer: 0,
menuElement: 0,
someFunction: function () {
// alert (this.clientValidation) "this" is the object scope
}
};
// then you access the object properties:
alert( config.clientValidation ); // true
答案 3 :(得分:0)
命名空间将类定义与冲突分开,但是,它不会解决全局变量问题。这是一个临时修复。
全局变量的解决方案是使用一个类实例来封装本来是全局的属性。封装是面向对象编程的三大支柱之一。
有关具有封装属性的命名空间的类的示例,请参阅参考资料。 另外,我将展示如何创建使用该类的自定义jquery插件。 http://www.robusthaven.com/blog/javascript-development/Automatically-generate-the-table-of-contents-with-jQuery
当我需要持久保存通常需要创建全局变量的数据时,我会使用http://api.jquery.com/jQuery.data/将对象形式的数据附加到使用此数据的dom元素。