Javascript 如何避免全局变量?

Javascript 如何避免全局变量?,javascript,Javascript,我被告知不要使用全局变量 我使用它来关闭/打开客户端验证 我用另外两个来控制我的下拉菜单 如果这些不应该是gloval变量,我应该把它们放在哪里 /* 全球的 */ 下面是一篇关于javascript名称空间的文章 我觉得你们这些人可能是全球选手的好人选。Globals应该被保留用于对应用程序有广泛影响的操作,比如跨多个部分控制基本行为 现在,如果您想为它们创建一个“名称空间”,它很简单: var globalControls = { client_validation:1, m

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

我使用它来关闭/打开客户端验证

我用另外两个来控制我的下拉菜单

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

/* 全球的 */


下面是一篇关于javascript名称空间的文章


我觉得你们这些人可能是全球选手的好人选。Globals应该被保留用于对应用程序有广泛影响的操作,比如跨多个部分控制基本行为

现在,如果您想为它们创建一个“名称空间”,它很简单:

var globalControls = {
    client_validation:1,
    menu_timer:0,
    menu_elment:0,
    window_onload:i0
};
Javascript还没有真正的名称空间。对象被用作它们的替代品,直到ECMAScript的下一个版本可能开始添加该功能。

标题应该是“如何避免全局变量”?不过没关系

可以创建对象并为其指定属性。然后在对象中有变量,这些变量只能通过这个对象访问,不能通过全局范围访问

例如:

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

名称空间将类定义与冲突分开,但是,它无法解决全局变量问题。这是暂时的解决办法

全局变量的一个解决方案是使用一个类实例来封装否则将是全局的属性。封装是面向对象编程的三大支柱之一

有关具有封装属性的命名空间的类的示例,请参见。 此外,我还展示了如何创建使用该类的自定义jquery插件。


当我有需要持久化的数据时,通常需要创建一个全局变量,而我使用该数据将对象形式的数据附加到dom元素。

关于一个不相关的注释:尽管您一贯使用缩进样式,但我发现它比Gnu样式更难读取。这是一种非常非JS-y的缩进风格。IMO将代码放在大括号内与大括号本身处于同一级别是可读性差的主要原因。
window.onload=i0按您的方式处理很好。不要将其更改为
globalControls
上的
window\u onload
属性,如该答案中所示。菜单元素:0;后面应该有逗号吗?是的,逗号,那只是一个拼写错误(已修复)@迈克-为什么要更改
窗口。onload=i0从问题到对象上的
window\u onload
属性的语句?我将其更改为window\u onload,使其看起来像另一个配置标志。除此之外,没有其他真正的目的。虽然这可以从理论上回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。
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