JavaScript创建命名空间的5种写法


Posted in PHP onJune 24, 2014

在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 = 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 = 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 = 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 = NameSpace || {};

NameSpace.Hello = (function() {

  var name = 'world';

  var sayHello = function(_name) {

    return 'Hello ' + (_name || name);

  };

  return {

    sayHello: sayHello

  };

}());

五、Function的简洁写法

这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new),方案来自stackoverflow:

var NameSpace = NameSpace || {};

NameSpace.Hello = new function() {

  var self = this;

  var name = 'world';

  self.sayHello = function(_name) {

    return 'Hello ' + (_name || name);

  };

};

欢迎补充。
PHP 相关文章推荐
IStream与TStream之间的相互转换
Aug 01 PHP
php cookie的操作实现代码(登录)
Dec 29 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
浅析PHP程序设计中的MVC编程思想
Jul 28 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
Oct 15 PHP
thinkphp循环结构用法实例
Nov 24 PHP
smarty模板引擎之分配数据类型
Mar 30 PHP
php实现求相对时间函数
Jun 15 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 PHP
PHP获取windows登录用户名的方法
Jun 24 #PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 #PHP
PHP判断表单复选框选中状态完整例子
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
Jun 23 #PHP
You might like
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
php分页查询的简单实现代码
2017/03/14 PHP
JavaScript 中的事件教程
2007/04/05 Javascript
初学Javascript的一些总结
2008/11/03 Javascript
一个选择最快的服务器转向代码
2009/04/27 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
python概率计算器实例分析
2015/03/25 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
Python实现自动整理文件的脚本
2020/12/17 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
介绍一下Java中的static关键字
2012/05/12 面试题
日语专业毕业生自荐信
2013/11/11 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
英文版辞职信
2015/02/28 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
社区党务工作总结2015
2015/05/19 职场文书
抢劫罪辩护词
2015/05/21 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python