在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子:

 
var sayHello = function() {
return 'Hello var';
}; function sayHello(name) {
return 'Hello function';
}; sayHello();
 
最终的输出为
 
> "Hello var"
 
为什么会这样,根据 StackOverFlow 的解释,实际上JavaScript的是按如下顺序解析的。

function sayHello(name) {
return 'Hello function';
}; var sayHello = function() {
return 'Hello var';
}; sayHello();
 
不带var的function声明被提前解析了,因此现代的JS写法建议你始终使用前置var声明所有变量;
 
避免全局变量名冲突的最好办法还是创建命名空间,下面是在JS中合建命名空间的几种常用方法。
 
 
通过函数(function)创建
 
这是一种比较常见的写法,通过声明一个function实现,函数里设置初始变量,公共方法写入prototype,如:
 
var NameSpace = window.NameSpace || {};
/*
Function
*/
NameSpace.Hello = function() {
  this.name = 'world';
};
NameSpace.Hello.prototype.sayHello = function(_name) {
  return 'Hello ' + (_name || this.name);
};
var hello = new NameSpace.Hello();
hello.sayHello();
 
这种写法比较冗长,不利于压缩代码(jQuery使用fn代替prototype),而且调用前需要先实例化(new)。使用Object写成JSON形式可以写得紧凑些:
 
通过JSON对象创建Object
 
/*
Object
*/
var NameSpace = window.NameSpace || {};
NameSpace.Hello = {
    name: 'world'
  , sayHello: function(_name) {
    return 'Hello ' + (_name || this.name);
  }
};
 
调用
 
NameSpace.Hello.sayHello('JS');
> Hello JS;
 
这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加this指示作用域,写法也略有冗余。
 

通过闭包(Closure)和Object实现

 
在闭包中声明好所有变量和方法,并通过一个JSON Object返回公有接口:
 
var NameSpace = window.NameSpace || {};
NameSpace.Hello = (function() {
  //待返回的公有对象
  var self = {};
  //私有变量或方法
  var name = 'world';
  //公有方法或变量
  self.sayHello = function(_name) {
    return 'Hello ' + (_name || name);
  };
  //返回的公有对象
  return self;
}());
 
Object和闭包的改进型写法
 
上个例子在内部对公有方法的调用也需要添加self,如:self.sayHello(); 这里可以最后再返回所有公有接口(方法/变量)的JSON对象。
 
var NameSpace = window.NameSpace || {};
NameSpace.Hello = (function() {
  var name = 'world';
  var sayHello = function(_name) {
    return 'Hello ' + (_name || name);
  };
  return {
    sayHello: sayHello
  };
}());
 
Function的简洁写法
 
这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new),方案来自stackoverflow
 
var NameSpace = window.NameSpace || {};
NameSpace.Hello = new function() {
  var self = this;
  var name = 'world';
  self.sayHello = function(_name) {
    return 'Hello ' + (_name || name);
  };
};

调用

NameSpace.Hello.sayHello();

最新文章

  1. Rxjava cold/hot Observable
  2. this的面面观
  3. tomcat7禁用catalina.out输出
  4. 新手不了解Xcode和mac系统可能犯得错误和我的建议
  5. Java Lambda简明教程(一)
  6. C++前置++与后置++的区别与重载
  7. 转移服务器,DEDE网站遇到no input file specified!
  8. 如何从Android工程导出apk安装包
  9. Android ColorMatrix类图像颜色处理-黑白老照片、泛黄旧照片、高对比度等效果
  10. Ubuntu设置代理的方法
  11. Date对象方法
  12. 在不安装sqlite3的时候使用sqlite3数据库以及问题/usr/bin/ld: skipping incompatible.....的解决
  13. Spring如何支持可扩展
  14. Javascript-购物车结算-案例
  15. 函数式编程语言(Fuction Program Language)
  16. 查找xml中的接口名及涉及表名并输出
  17. cetos7最小化安装设置网络启动和更新yum源
  18. java学习1ATM
  19. Java并发系列[10]----ThreadPoolExecutor源码分析
  20. cv.Mat 与 .txt 文件数据的读写操作

热门文章

  1. VisualSVN Server 安装
  2. java代码实现mock数据
  3. oracle索引查询
  4. Windows下解决系统端口被VM虚拟机占用问题
  5. CAFFE(三):Ubuntu下Caffe框架安装(仅仅Caffe框架安装)
  6. 微信小程序开发(七)获取手机网络类型
  7. C - Calculation 2 HDU - 3501 (欧拉)
  8. HashMap源码分析四
  9. ubuntu卸载/更新Cmake
  10. Tomcat下配置JNDI的三种方式