码迷,mamicode.com
首页 > 其他好文 > 详细

关于全局变量

时间:2014-09-10 14:08:10      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   使用   java   ar   for   文件   

1.全局变量越多,引入错误的概率越高。

2.全局变量与全局函数越多,发生命名冲突概率越高。

3.函数过分依赖全局变量,会大幅度降低代码的可测试性与可维护性。

4.避免一切意外的全局变量。

5.使用单全局变量方式:

  创建唯一全局对象名是独一无二的,将所有的功能代码挂在到这个全局变量上。

  例子:

  

function Book(title){
  this.title = title;
  this.page = 1;    
};
Book.prototype.turnPage = function(direction){
  this.page += direction;
};

var Chapter1 = new Book("book chaper1");
var Chapter2 = new Book("book chaper2");
var Chapter3 = new Book("book chaper3");

//以上代码创建了4个全局对象,Book,Chaper1,Chaper2,Chaper3

//下面使用单全局变量模式

var MaintainableJS = {};

MaintainableJS.Book = function(title) {

   this.title = title;
   this.page = 1;   

};

MaintainableJS.Book.prototype.turnPage =  function(direction){

  this.page += direction;

};

MaintainableJS.Chaper1 = new MaintainableJS.Book("Book chaper1");
MaintainableJS.Chaper2 = new MaintainableJS.Book("Book chaper2");
MaintainableJS.Chaper3 = new MaintainableJS.Book("Book chaper3");

 

单全局变量中同样包含“命名空间”概念:

var ZakasBooks = {};

//表示这本书的命名空间
var ZakasBooks.MaintainableJS = {};

//表示另一本书的命名空间
var ZakasBooks.HightPerformanceJS = {};

一个常见的约定是每个文件中都通过创建新的全局对象来声明自己的命名空间。这种情况下上面的例子给出的方法是够用的。

 

如果现在有一种情况,每个文件都需要给一个命名空间加载东西,那么首先你要保证这个命名空间是已经存在的,这时候全局对象非破坏性的处理命名空间的方式就非常有用,这项操作的基本模式如下:

var YourGlobal = {
  namespace: function(ns){
    var parts = ns.split("."),// 以.为分隔拆分这个字符串将其装入数组
    object = this,
    i,len;
    for(i = 0;len = parts.length; i < len; i++){
      if (!object[parts[i]]) {
        object[parts[i]] = {};
      }
      object = object[parts[i]];
    }

    return object;
  }
};

 当我们给namespace部分传入一个表示命名空间的字符串,它会非破坏性的创建这个命名空间,基本用法:

//这里同时创建了YourGlobal.Books和YourGlobal.Books.MaintainableJavaScript
//由于之前并没有创建过它们,因此它们每个都是全新创建的
YourGlobal.namespace("Books.MaintainableJavaScript");

//使用这个命名空间
YourGlobal.Books.MaintainableJavaScript.author = "nick";

//namespace代码段显示,添加新的命名空间时会判断是否已经创建,没有则新建,有则继续返回这个命名空间对象添加进去。
YourGlobal.namespace("Book.HightPerformanceJS");

//合法的引用
console.log(YourGlobal.Books.MaintainableJavaScript.author);

//同样可以在方法调用后立即给它添加属性
YourGlobal.namespace("Books").ANewBook = {};

利用这种方法,每个文件都可以先调用namespace()来声明开发者要使用的命名空间,这样做不会对已有的命名空间造成任何破坏。

 

总结自《编写可维护的javascript》

关于全局变量

标签:style   blog   color   io   使用   java   ar   for   文件   

原文地址:http://www.cnblogs.com/SLEBEE/p/3964141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!