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 相关文章推荐
php,不用COM,生成excel文件
Oct 09 PHP
php 分页函数multi() discuz
Jun 21 PHP
php strrpos()与strripos()函数
Aug 31 PHP
关于PHP的curl开启问题探讨
Apr 08 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
php curl模拟post请求和提交多维数组的示例代码
Nov 19 PHP
微信红包随机生成算法php版
Jul 21 PHP
php实现图片按比例截取的方法
Feb 06 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
用PHP和ACCESS写聊天室(九)
2006/10/09 PHP
php读取xml实例代码
2010/01/28 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
Python对wav文件的重采样实例
2020/02/25 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
什么是.net
2015/08/03 面试题
制冷与电控专业应届生求职信
2013/11/11 职场文书
大学军训自我鉴定
2013/12/15 职场文书
小学生手册家长评语
2014/04/16 职场文书
七一建党日演讲稿
2014/09/05 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS