2

我是 JavaScript 中的 OOP 新手,因为我一直使用一些框架和我自己的简单构造,但从未想过在幕后发生了什么。现在,我想解决许多 JS 程序员面临的一个问题——全局变量。我知道制作全局变量是一种不好的做法,许多人建议改用对象。这就是出现问题的地方。我不知道创建对象并在应用程序中的某处调用它以获取全局变量值的最佳方法是什么。例如,我不确定是否使用 init 函数以及如何返回全局变量值(通过函数或“点”表示法)。我看过很多关于对象的例子,但它们的风格看起来不同。想象一个具体的例子。我想将全局变量存储在一个对象中 - 窗口' s 高度和窗口的宽度。为了使其跨浏览器,我将使用此代码

var w = window,
    d = document,
    e = d.documentElement,
    g = d.getElementsByTagName('body')[0],
    w = w.innerWidth || e.clientWidth || g.clientWidth, // this is global variable
    h = w.innerHeight|| e.clientHeight|| g.clientHeight; // and this is global varibale too

那么,如何在 abject 中应用此代码以及如何在应用程序中的某个位置获取这些全局变量的值?

编辑

现在,我的代码如下所示:

var module = (function(){
var w = window,
d = document,
e = d.documentElement,
g = d.getElementsByTagName('body')[0],
width = w.innerWidth || e.clientWidth || g.clientWidth,
height = w.innerHeight || e.clientHeight || g.clientHeight;
return {
  getHeight:function(){
     return height;
  },
  getWidth:function(){
     return width;
  }
}
}());

要访问heightwidth属性,我调用getHeightgetWidth方法。唯一让我觉得奇怪的是这些returns重叠在里面return。这是正确的做法吗?

4

1 回答 1

4

我会建议你避免使用 Globals

全局变量是一个非常糟糕的主意。

原因:您的代码有被添加到页面中的任何其他 JavaScript 覆盖的危险。

解决方法:使用闭包和模块模式

解释模块和闭包的示例代码

module = function(){
   var current = null;
   var labels = {
      'home':'home',
      'articles':'articles',
      'contact':'contact'
   };
   var init = function(){
   };
   var show = function(){
      current = 1;
   };
   var hide = function(){
      show();
   }
   return{init:init, show:show, current:current}
}();
module.init();

您的代码:

var module = (function(){
var w = window,
d = document,
e = d.documentElement,
g = d.getElementsByTagName('body')[0],
width = w.innerWidth || e.clientWidth || g.clientWidth,
height = w.innerHeight || e.clientHeight || g.clientHeight;
    var getWidth = function(){
        console.log(width);
        return width;
}
    var getHeight = function(){
        console.log(height);
        return height;
}
    return{getWidth:getWidth, getHeight:getHeight}
}());
module.getHeight();
module.getWidth();

DEMO FIDDLE

于 2013-09-13T05:16:22.790 回答