在Window对象上设置属性是否被视为不良做法?

时间:2010-09-09 18:50:38

标签: javascript architecture

我正在编写一个非常复杂的JavaScript应用程序,它有一个MVC架构,我正在使用Prototype的Class支持和Module模式实现。该应用程序使用AJAX和Observer模式。我在DOM加载时创建我的控制器实例,传递一个视图,一些模型是从JSON数据创建的,然后就可以了。

但是,我发现我必须将我的控制器实例设置为Window对象的属性 - 即。在不使用var的情况下声明它 - 因为我有一个AJAX成功回调,它刷新了控制器拥有的视图对象,而在代码中我的好MVC世界不在范围内。

我调查了将视图对象作为参数传递给包含AJAX代码的函数,但这非常混乱,并且会导致一些可怕的违反MVC模式的行为,例如耦合模型和视图。这太可怕了。

是否正在将我的控制器实例直接存储在Window被视为错误的表单上?它有点像对我使用全局变量,但我看不到任何方法。

3 个答案:

答案 0 :(得分:10)

在窗口对象上设置属性等同于创建全局变量。也就是说,有时这样做是不可避免的,但你应该尽量将它保持在最低限度,因为它最终会污染全局命名空间。

在您的情况下,创建单个属性并不是那么糟糕。如果您想要格外小心,可以为需要全局访问的任何内容显式创建命名空间:

// In init:
var mynamespace = {};

. . .

// Once the controller is available:
var namespace = window.mynamespace;
namespace.controller = controller;
namespace.foo = bar; // Set other stuff here as well.

答案 1 :(得分:2)

我会说这是不好的做法。如果必须的话,您可以随时轻松地为应用程序创建命名空间并将全局变量放在那里。

答案 2 :(得分:2)

当您想要调用事先未知名称的全局函数时,它们非常有用。

var funcName = "updateAns" + ansNum;
window[funcName]();

他们可以习惯 a)在大多数情况下避免邪恶的逃避。 b)避免对全局变量的引用错误。

如果未定义全局x,

x = x + 1将生成引用错误。 window.x = window.x + 1不会