全局名称空间变量:任何备选方案

Global namespaced variable: any alternative?

本文关键字:任何备 方案 变量 空间 全局      更新时间:2023-09-26

如果有三个对象:

  • 对象A触发一个事件,传递一个"date"参数
  • 对象B触发一个事件,传递一个"category"参数
  • 对象C触发一个事件,传递一个谷歌地图"边界"参数
  • 对象D监听事件A、B和C执行单个函数,该函数需要A(日期)、B(类别)和C(映射边界)的当前状态

有没有办法使用:

window.app = {}; //--> global 
var curDate = app.appState.curDate; 
var curCategory = app.appState.curCategory; 
var curBounds = app.appState.curBounds; 

我不太喜欢使用全局变量,即使它们是按名称命名的,因为用户可以直接从浏览器访问这些变量并破坏界面
后端仍然是安全的,但不知怎么的感觉不对。但似乎没有一个可行的替代方案可以从控制器D访问这两个变量。我注意到传递参数并使其适合可能会成为一项非常繁琐的活动,而且它似乎不太容易维护。

编辑:结构有点像这样:

App ---> app_dates       ---> datesController (trigger date change event fom view) 
    ---> app_categories  ---> categoryController (trigger category change from view) 
    ---> app_map         ---> mapController (trigger map bounds change from Google map)
    ---> app_home        ---> Listen to the events, send a request to the server with above parameters) 

即使在雅虎,他们也使用一个全局变量
http://yuiblog.com/blog/2006/06/01/global-domination/

我认为,对于特定的用例(需要从应用程序中的所有部分访问的模块对象/变量),使用全局窗口而不是传递参数是可以接受的。

在我的情况下,我想创建一种"config"对象是很有用的,它将全局引导到命名空间中,并在应用程序启动时分配默认值。

try requireJS,requireJS的目的之一是不污染全局范围在requireJS中,您可以将状态对象定义为以下

define('appState', [],function(){
   return {
       curDate: null, 
       curCategory: null, 
       curBounds: null,
   }; 
});

现在,对于任何需要或修改应用程序状态的模块,它只会将appState添加为依赖项,它将作为参数而不是全局变量传递,就像下面的一样

define('datesController',['appState'],function(appState){
    var datesController = Backbone.View.extend({
        events:{
            'change #date': 'dateChanged'
        }
        dateChanged: function(){/*here you can access appState and modify it*/},
    });
    return datesController;
});

然后,每当你需要创建datesController对象时,你所需要的就是

require('datesController', function(datesController){
    var datesControllerObj =  new datesController({});
});

这段代码是关于requireJS的简介,你可以参考下面的教程

http://javascriptplayground.com/blog/2012/07/requirejs-amd-tutorial-introduction/