代码之家  ›  专栏  ›  技术社区  ›  John Topley

在窗口对象上设置属性被认为是不好的做法吗?

  •  12
  • John Topley  · 技术社区  · 16 年前

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

    Window 对象,即不使用 var -因为我有一个AJAX成功回调,它刷新了控制器拥有的视图对象,在代码的这一点上,我漂亮的小MVC世界不在范围之内。

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

    窗口 被认为是不好的形式?对我来说,这闻起来有点像使用全局变量,但我看不出有什么方法可以绕过它。

    3 回复  |  直到 16 年前
        1
  •  12
  •   levik    16 年前

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

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

    // 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.
    
        2
  •  2
  •   John Topley    16 年前

    我想说这是个坏习惯。如果必须的话,您可以始终轻松地为应用程序创建一个名称空间,并将globals放在其中。

        3
  •  2
  •   letronje    16 年前

    当您想调用一个名称事先未知的全局函数时,它们很有用。

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

    它们可以用来 b) 避免对全局变量的引用错误。

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