繁体   English   中英

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

[英]Is setting properties on the Window object considered bad practice?

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

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

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

是否正在将我的控制器实例直接存储在Window认为是不好的形式? 它有点像对我使用全局变量,但我看不出任何方法。

在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.

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

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

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

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

如果未定义全局x,则x = x + 1将生成参考错误。 window.x = window.x + 1不会

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM