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 相关文章推荐
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
用PHP将网址字符串转换成超链接(网址或email)
May 25 PHP
php常用文件操作函数汇总
Nov 22 PHP
php两种无限分类方法实例
Apr 21 PHP
php中文验证码实现方法
Jun 18 PHP
PHP+JS实现大规模数据提交的方法
Jul 02 PHP
php批量修改表结构实例
May 24 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
php ajax数据传输和响应方法
Aug 21 PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 PHP
PHP设计模式入门之状态模式原理与实现方法分析
Apr 26 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第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
PHP加密解密函数详解
2015/10/28 PHP
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
python基于queue和threading实现多线程下载实例
2014/10/08 Python
Python修改MP3文件的方法
2015/06/15 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
python实现比较文件内容异同
2018/06/22 Python
Python类的继承用法示例
2019/01/31 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
python IDLE添加行号显示教程
2020/04/25 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
应届生服务员求职信
2013/10/31 职场文书
厂区绿化方案
2014/05/08 职场文书
投标诚信承诺书
2014/05/26 职场文书
办理信用卡工作证明
2014/09/30 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
护士个人总结范文
2015/02/13 职场文书
2015政治思想表现评语
2015/03/25 职场文书
2015入党自传书范文
2015/06/26 职场文书
三八妇女节致辞
2015/07/31 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
python 学习GCN图卷积神经网络
2022/05/11 Python