欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-02 16:50:40
在javascript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: 复制代码 代码如下: var sayhello...

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

复制代码 代码如下:

var sayhello = function() {
  return 'hello var';
};

function sayhello(name) {
  return 'hello function';
};

sayhello();


最终的输出为
复制代码 代码如下:

> "hello var"

为什么会这样,根据 * 的解释,实际上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),方案来自*:

复制代码 代码如下:

var namespace = namespace || {};
namespace.hello = new function() {
  var self = this;
  var name = 'world';
  self.sayhello = function(_name) {
    return 'hello ' + (_name || name);
  };
};

欢迎补充。