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

Joh*_*ley 13 javascript architecture

我正在编写一个非常复杂的JavaScript应用程序,它具有MVC架构,我正在使用Prototype的Class支持和Module模式实现.该应用程序使用AJAX和Observer模式.我在DOM加载时创建了我的控制器实例,传递了一个视图,并且从JSON数据创建了一些模型并将其移除.

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

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

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

lev*_*vik 10

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

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

// 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.
Run Code Online (Sandbox Code Playgroud)