如何避免全局变量?

时间:2011-11-08 00:34:39

标签: javascript

我被告知不要使用全局变量。

我用一个来关闭/开启客户端验证。

我再使用两个来控制下拉菜单。

如果这些不应该是全球变量,我应该把它们放在哪里?

/ * 全球 * /

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

4 个答案:

答案 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元素。